我在导航栏中列出了3个片段,其中包括一个webview。通过单击导航抽屉中的项目,我想在片段之间切换,但同时也保存其状态。给定代码是导航抽屉的监听方法。如何在实例化新片段之前检查片段是否存在任何现有实例?
private void selectItem(int position) {
Fragment newFragment = new Fragment_1();
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
switch(position) {
case 0:
newFragment = new Fragment_1();
break;
case 1:
newFragment = new Fragment_2();
break;
case 2:
break;
}
android.support.v4.app.FragmentTransaction t = getSupportFragmentManager().beginTransaction();
t.replace(R.id.content_frame, newFragment);
t.addToBackStack(null);
t.commit();
}
答案 0 :(得分:0)
嗯,你必须分两步完成:
1 /首先,在这种情况下,FragmentTransaction的替换方法不是您所需要的。你必须切换到
t.add(R.id.content_frame, newFragment, TAG)
TAG是片段的标签(字符串)。在您的示例中,您正在处理2个片段,因此您应该定义:
private final String TAG_FRAGMENT1 = "fragment1";
private final String TAG_FRAGMENT2 = "fragment2";
根据您要添加的片段,您将调用:
t.add(R.id.content_frame, newFragment, TAG_FRAGMENT1);
OR
t.add(R.id.content_frame, newFragment, TAG_FRAGMENT2);
其次是:
t.commit();
2 /既然您将拥有TAG片段,您将能够在片段回溯中找到现有的framgnent1实例:
getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT1);
这将返回fragment1的实例(如果存在)或" null"在这种情况下,您将必须创建一个新实例并且"添加"它有一个fragmentTransaction(用我在1 /中解释的)
3 /如果findFragmentByTag返回一个片段(而不是null),那么你应该使用replace方法:
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentByTag(TAG_FRAGMENT1);
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content_frame, f);
ft.commit();