Android FragmentManager.findFragmentByTag始终返回null

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

我有一个活动,通过替换片段来切换内容。 在这个活动的onCreate中,我用以下代码设置了第一个片段:

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();
    }
}