Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将对象传递到片段中_Android_Fragment_Android Bundle - Fatal编程技术网

Android 将对象传递到片段中

Android 将对象传递到片段中,android,fragment,android-bundle,Android,Fragment,Android Bundle,我最近处理了很多片段,并使用了两种不同的方法将对象传递给片段,但我能看到的唯一区别是,在下面FragmentOne所采用的方法中,您传递的对象必须实现可序列化的接口() 使用其中一个比另一个有什么好处吗 public class FragmentOne extends Fragment { public static final String FRAGMENT_BUNDLE_KEY = "com.example.FragmentOne.FRAGMENT_BUNDLE_K

我最近处理了很多
片段
,并使用了两种不同的方法将对象传递给片段,但我能看到的唯一区别是,在下面FragmentOne所采用的方法中,您传递的对象必须实现
可序列化的
接口()

使用其中一个比另一个有什么好处吗

public class FragmentOne extends Fragment {
    public static final String FRAGMENT_BUNDLE_KEY = 
        "com.example.FragmentOne.FRAGMENT_BUNDLE_KEY";

    public static FragmentOne newInstance(SomeObject someObject) {
        FragmentOne f = new FragmentOne();
        Bundle args = new Bundle();
        args.putSerializable(FRAGMENT_BUNDLE_KEY, someObject);
        f.setArguments(args);
        return f;
    }

    public SomeObject getSomeObject() {
        return (SomeObject) getArguments().getSerializable(FRAGMENT_BUNDLE_KEY);
    }
}


有3种方法可以将对象传递给片段

它们是:

  • 通过setter传递对象是最快的方式,但状态不会自动恢复
  • setArguments
    Serializable
    对象一起使用是最慢的方法(但我认为对于小对象也可以),并且您可以自动恢复状态
  • 作为
    Parcelable
    传递是一种快速的方式(如果要传递元素集合,则首选第二种方式),并且可以自动恢复状态

  • 对于列表等集合:

    我想分享我的经验

    您需要实现Parcelable

    只需使用putParcelableArrayList方法

    ArrayList<LClass> localities = new ArrayList<LClass>;
    ...
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
    fragmentInstance.setArguments(bundle);
    
    return fragmentInstance;
    

    因此,除非您出于其他原因需要自定义ArrayList,否则您可以避免做任何额外的工作,只为您的Location类实现Parcelable。

    可能的重复项也可以使用
    Parcelable
    ,而不是
    Serlializable
    ,除非你真的需要
    Serializable
    来实现一些非Android的特定目的
    Parcelable
    显然要快得多。谢谢你的回答标记-我觉得你链接到的另一个答案与我在这里提出的问题相似,但有足够的不同,使这个问题更有用。然后也许可以编辑你的问题,使差异更明显。每个人都希望将数据传递到新创建的片段中。在回答我所链接的问题时,我展示了将数据传递到新创建的片段中的标准模式。如果您希望得到更多,则需要解释“more”是什么。AFAIK,在1)中,如果您在1)中使用setRetainInstance(true),则您确实已自动恢复状态。在1)中,setRetainInstance将按原样保存初始化的实例。当我们转到其他地方,操作系统关闭应用程序时,我们无法恢复数据。因此,在特定情况下,这可能是一种选择。
    ArrayList<LClass> localities = new ArrayList<LClass>;
    ...
    Bundle bundle = new Bundle();
    bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
    fragmentInstance.setArguments(bundle);
    
    return fragmentInstance;
    
    localities = savedInstanceState.getParcelableArrayList(KEY_LCLass_LIST);