Android FragmentManager.findFragmentByTag始终返回null
我有一个活动,通过替换片段来切换内容。 在这个活动的onCreate中,我用以下代码设置了第一个片段:Android FragmentManager.findFragmentByTag始终返回null,android,android-fragments,fragmentmanager,Android,Android Fragments,Fragmentmanager,我有一个活动,通过替换片段来切换内容。 在这个活动的onCreate中,我用以下代码设置了第一个片段: fm.beginTransaction().add(R.id.container, new FooFragment(), "f_0").commit(); 之后,我想根据我使用的抽屉中的整数,将这个片段切换为另一个片段,代码如下: int position = //I get my index here Fragment f = fm.findFragmentByTag("f_" + pos
fm.beginTransaction().add(R.id.container, new FooFragment(), "f_0").commit();
之后,我想根据我使用的抽屉中的整数,将这个片段切换为另一个片段,代码如下:
int position = //I get my index here
Fragment f = fm.findFragmentByTag("f_" + position); //(1)
if (f == null) {
switch (position) {
case 0:
f = new FooFragment();
break;
case 1:
f = new BarFragment();
break;
//Etc...
}
}
//Then I replace the actual Fragment by the new one
fm.beginTransaction()
.replace(R.id.container, f, "f_" + position)
.commit();
我的问题是1上的代码总是返回null,所以每次我更改片段时,它都会创建一个新实例。我希望在任何时候每个片段类型只有一个实例
谢谢。设置第一个片段:
getSupportFragmentManager().beginTransaction().addToBackStack("f_0").replace(R.id.container, new FooFragment(), "CURRENT_FRAGMENT_TAG").commit();
使用此函数替换片段:
public void replaceFragment(Fragment fragment, String tag) {
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag("CURRENT_FRAGMENT_TAG");
//to avoid adding the same fragment, you can use 'instanceof' instead of comparator
if (currentFragment.getClass() == fragment.getClass()) {
return;
}
getSupportFragmentManager().popBackStack(tag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(tag).replace(R.id.container, fragment, "CURRENT_FRAGMENT_TAG")
.commit();
}
执行示例:
replaceFragment(new FooFragment(), "f_" + position);
按下后覆盖
同样的问题:/I我使用静态int来计算FooFragment的实例数,但它仍然会增加每个Fragmentswap。因此,如果您确实希望fragment onCreate的一个实例只被调用一次,那么您就不应该使用mu解决方案,并且在片段中,在onCreate方法中添加setRetainInstancetrue。
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
finish();
} else {
super.onBackPressed();
}
}