在活动之间分享无头片段

时间:2015-05-12 20:42:23

标签: android android-fragments

出于某种原因,我的理解是无头片段在你的申请期间存在。有了这个理解,在我试图在startActivityForResult()之间保持一个对象时,我把对象放在像这样的无头片段中

    private HeadlessFragment modelFragment;
    modelFragment = (HeadlessFragment)
 getSupportFragmentManager().findFragmentByTag(Constants.HEADLESS_FRAGMENT_TAG);
            if (modelFragment == null){
                modelFragment = new HeadlessFragment();
            }
    modelFragment.setInvoice(invoice);

我可以确认自定义对象已设置,但是当我转到下一个活动并尝试通过调用具有相同标记的findFragmentByTag来获取相同的对象时,该对象为空。

无头碎片是否在两个活动生命周期之间存活?我确实在那个Headless Fragment上设置了setRetainInstance(true)。我希望我不必在我的自定义对象上实现Parceable。

1 个答案:

答案 0 :(得分:0)

  

出于某种原因,我的理解是无头片段在你的申请期间存在。

没有。片段由活动拥有,而不是应用程序范围的构造。

  

我可以确认自定义对象已设置,但是当我转到下一个活动并尝试通过调用具有相同标记的findFragmentByTag来获取相同的对象时,该对象为空。

至少有两个原因:

首先,至少在您展示的代码中,您永远不会通过FragmentManager将片段添加到FragmentTransaction。因此,创建片段的活动将无法通过findFragmentByTag()找到该片段,因为FragmentManager不了解该片段。

其次,每个活动都有自己的FragmentManager,一个活动的碎片在另一个活动中无法访问。

  

我希望我不必在自定义对象上实现Parceable。

然后不要传递对象。传递其他活动可以通过其检索对象的信息(例如,密钥或ID)(从单个POJO缓存,通过查询数据库等)。

或者,不要将它们作为单独的活动,而是将它们作为一个活动中的单独(常规)片段。

或者,实施Serializable,但Parcelable执行得更快。