2012-11-30 26 views
1

这是我遇到的问题。我有一个活动A有一个片段F,它包含在FragmentPagerAdapter FPA中,在视图V中。(A-> V-> FPA-> F)你可以在onDestroy()中分离一个片段吗?

当A被破坏时(或在此情况,换出),F被附加,并在FPA中,这是在V.然而,当A被重新创建(例如有人点击后退按钮回到活动,例如),V和FPA不存在,所以F被重新创建(处于附加状态!),但是对于不存在的东西,所以它不在视图层次结构中。然后,当FPA试图在这个片段上实例化状态时,它会尝试附加它,它什么都不做,因为它已经连接到了空气中。

显然有一些方法可以解决这个问题(例如,在活动的onCreate中存在V和FPA,以便片段在创建时可以到达某处),但是我想继续懒洋洋地只在需要时才创造FPA和V.因此,似乎更新F的状态以在onDestroy()中分离将是可取的。然而,state保存在onPause()中,这意味着我在这里有点不走运。

有没有办法在A的onDestroy()中更新F的保存状态?有没有办法说“如果活动被破坏,不要补充这个片段”?有没有其他明显的思考方式,我不考虑?感觉就像我在这里以错误的方式处理事情。

回答

1

我有我的问题FragmentPagers。我所做的是在活动onCreate()中传递一个空包,然后在每次创建时从头创建一切。像这样:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); 
    // do my stuff 
} 

这种方式不会在重新创建活动时传递片段。

+0

噢 - 这是一个很好的资源trictive解决方案。绝对不适用于我的活动,该活动具有需要恢复的其他片段(不在FragmentPagerAdapter中)。 – secureboot

+0

为了在使用此解决方案时仍然保留某些片段的状态,我所做的是以编程方式将碎片状态保存在Activity的状态包中。在Activity的onSaveInstanceState()中,我调用Fragment的onSaveInstanceState()来允许Fragment将其状态添加到Bundle中。在Activity的onCreate()中,我以编程方式创建并添加片段,然后将Bundle传递给Fragment.setArguments()。片段通过其onCreate()中的getArguments()从Bundle中检索已保存的状态,并忽略传递给其onCreate()的Bundle。 – Trevor

1

您写道:

有没有考虑这一点,我不会考虑其他一些明显的方式?

这并不直接回答你的标题问题,但提供了一个方便的解决方案如何在ViewPager保存Fragment状态。

您可以保存Fragment状态时Activity被标记在ActivityFragment摧毁初始化Fragment

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.photos_pager_activity); 

    MyImageFragment fragment; 
    if (savedInstanceState != null) { 
     fragment = (MyImageFragment) getFragmentManager().findFragmentByTag("my_image_fragment_tag"); 
    } else { 
     fragment = new MyImageFragment(); 
     getFragmentManager().beginTransaction().add(android.R.id.content, fragment, "my_image_fragment_tag").commit(); 
    } 

参见:

Uses of fragment tags

ViewPager and fragments — what's the right way to store fragment's state?

+0

是的,但正如这些链接所解释的那样,如果您使用该标识,那么ID和标记将由FragmentPagerAdapter设置。 – secureboot

+0

为什么你不能拥有FPA设置标签? –

+0

不需要重写大部分内容,FPA有一个makeFragmentName函数用于创建标记名称,并将ID设置为容器的ID。 – secureboot

相关问题