Android:IllegalStateException:无法更改片段的标记

时间:2016-11-03 16:00:47

标签: android android-fragments illegalstateexception

我正在处理Fragment交易。我从主要活动的homepage_fragment开始,然后转到second fragment,但是当回到'homepage_fragment'时,我收到错误(如下所示)。我想回到homepage_fragment的同一个实例而不是新实例。

移动到change_fragment时会调用second fragment方法,而当移动到其他方式时调用change_fragment2

Fragment homepage_fragment = new HomePageFragment();
getFragmentManager().beginTransaction().add(R.id.activity_main, homepage_fragment,"homepage_fragment").commit();

这些是主要活动中实现的接口方法。

@Override
public void change_fragment(){
    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    String tag = "homepage_fragment";
    Fragment newFragment = new SecondFragment();
    ft.replace(R.id.activity_main,  newFragment);
    ft.addToBackStack(tag);
    ft.commit();
}

@Override
public void change_fragment2() {
    final FragmentTransaction ft = getFragmentManager().beginTransaction();
    //String tag1 = getFragmentManager().getBackStackEntryAt(getFragmentManager().getBackStackEntryCount()-1).getName();
    String tag1 = "second_fragment";
    int lastFragCount = getFragmentManager().getBackStackEntryCount() -1;
    String fragName= getFragmentManager().getBackStackEntryAt(lastFragCount).getName();
    Fragment newFragment = getFragmentManager().findFragmentByTag(fragName);
    ft.replace(R.id.activity_main, newFragment , tag1);
    ft.addToBackStack(tag1);
    ft.commit();
}

这是我得到的错误:

FATAL EXCEPTION: main
        Process: com.example.user.popupwindowdemo, PID: 10309
            java.lang.IllegalStateException: Can't change tag of fragment HomePageFragment{2141e52a #0 id=0x7f0c006f homepage_fragment}: was homepage_fragment now second_fragment

因为,在replace方法中传递的标记名称是标记当前片段,我不认为我在这里更改任何片段的标记名称。所以,他们应该保持不变。

调试时,findFragmentByTag()返回的对象引用是正确的,但它会在下一个语句后返回错误。我无法清楚地理解这里出了什么问题。有人能告诉我问题是什么吗?

1 个答案:

答案 0 :(得分:0)

您实际上从未创建过新的Fragment。这个方法:

Fragment newFragment = getFragmentManager().findFragmentByTag(fragName);

只是在后台堆栈中找到最后一个Fragment,然后您尝试将Fragment替换为自己。

创建片段后堆栈的常规方法是添加一个像这样的片段:

@Override
public void addFragment(String tag, Fragment fragment) {
    getFragmentManager().beginTransaction()
            .add(R.id.activity_main, fragment)
            .addToBackStack(tag)
            .commit();
}

然后您可以删除最后一个Fragment

@Override
public void removeFragment() {
    getFragmentManager().popBackStack();
}