IllegalStateException:片段已添加到tabhost片段中

use*_*104 62 tabs android android-lifecycle android-fragments fragment-tab-host

FATAL EXCEPTION: main
Process: com.example.loan, PID: 24169
java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form}
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533)
    at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5068)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

所以,我有一个使用tabhost构建的Android应用程序.共有三个选项卡,在tab2中,有一个按钮用于在tab2中进行片段事务(在片段活动中调用该函数)

FragmentTransaction t = getSupportFragmentManager().beginTransaction();
        t.replace(R.id.realtabcontent, mFrag);
        t.addToBackStack(null);
        t.commit();
Run Code Online (Sandbox Code Playgroud)

如果我像这样运行有例外:

  1. 在tab2内,我按下按钮更改片段
  2. 转到其他选项卡(例如,选项卡1或选项卡3)
  3. 按后退按钮
  4. 抛出异常

如何解决?谢谢你的帮助

Ujj*_*jju 122

当我们尝试在解雇之前添加相同的片段或DialogFragment两次时会发生这种情况,

只是打电话

if(mFragment.isAdded())
{
     return; //or return false/true, based on where you are calling from
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,我没有看到任何理由为什么要删除旧片段并再次添加相同的片段,因为我们可以通过简单地将参数传递给片段内的方法来更新UI /数据

  • 这应该是公认的答案.接受的答案毫无意义.首先,不应该否定`isAdded()`.其次,在注释中,建议将此代码放在`onCreate()`中,这也是荒谬的.这行代码应该直接放在添加(或替换)片段的行之前,而不是放在`onCreate()`或`onCreateView()`中.在其中任何一种方法中执行该代码都为时已晚. (5认同)
  • `if(fragment.iwego())fragmentTransaction.show(fragment);` (3认同)

vov*_*ost 9

删除旧片段,以防它仍然添加,然后添加新片段:

FragmentManager fm = getSupportFragmentManager();
Fragment oldFragment = fm.findFragmentByTag("fragment_tag");
if (oldFragment != null) {
    fm.beginTransaction().remove(oldFragment).commit();
}
MyFragment newFragment = new MyFragment();
fm.beginTransaction().add(newFragment , "fragment_tag");
Run Code Online (Sandbox Code Playgroud)


Dee*_*hta 8

您只需检查下面提到的片段中的一个条件:

if(!isAdded())
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

isAdded =如果片段当前已添加到其活动中,则返回true.取自官方文件.如果已添加该片段,则不会添加该片段

请查看以下链接以获取参考:http:
//developer.android.com/reference/android/app/Fragment.html#isAdded()

  • 这没有任何意义,你不能在onCreateView中返回void,你的意思是onCreate吗?我在那里试过这个并没有帮助我的问题 (6认同)
  • 这是添加到`onCreate`吗? (5认同)
  • 为什么否定标志?如果!isAdded(),不应该添加片段吗? (4认同)

小智 8

有时会因为没有从相应的布局中找到正确的 id 而发生。我遇到了这个问题。几个小时后,我发现我设置了错误的 recyclerview id。我改变了它,对我来说很好用。

因此,请仔细检查您的片段布局。

  • 谢谢,对我来说也是一样。异常消息不能更具误导性。 (2认同)

Meh*_*nki 7

您只需要在开始片段交易之前检查一种情况

 if (!fragmentOne.isAdded()){
            transaction = manager.beginTransaction();
            transaction.add(R.id.group,fragmentOne,"Fragment_One");
            transaction.commit();
 }
Run Code Online (Sandbox Code Playgroud)

这对我来说是完美的工作...