java.lang.IllegalStateException:碎片已添加 [英] java.lang.IllegalStateException: Fragment already added

查看:1338
本文介绍了java.lang.IllegalStateException:碎片已添加的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Android应用程序存在问题汇编,并与目标SDK 4.3上运行。该应用程序有两个活动,一个MainActivity这也是启动活动和SecondActivity。两者都使用片段。支持老设备也支持LIB使用。

在以下情况下谈到IllegalStateException异常:碎片已添加错误。

1)启动应用程序 - > MainActivity显示
2)切换到SecondActivity有意向
3)preSS的主页按钮
4)等待更长的时间(在24小时测试)
5)preSS再次应用程序图标 - >例外。如果时间较短,SecondActivity示出像预期

我看了在分片处理很多IllegalStateExceptions的,但他们都指出了一个问题,一个replace()方法。在堆栈跟踪,我自己的code没有被调用。

该Fragement是在Activies的onCreate(增加)方法:

 保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(..);
    ListFragment listFragment = this.getCaptureListFragment();
    FragmentTransaction TX = this.getSupportFragmentManager()的BeginTransaction()。
    tx.add(R.id.MainFragmentContainer,listFragment,list_fragment_tag);
    tx.commit();
}

私人ListFragment getListFragment(){
    ListFragment listFragment =(ListFragment)this.getSupportFragmentManager()findFragmentByTag(list_fragment_tag);
    如果(listFragment == NULL){
        listFragment =新ListFragment();
    }
    返回listFragment;
}


java.lang.RuntimeException的:无法启动的活动ComponentInfo {de.myexample.demo / de.myexample.demo.ui.SecondActivity}:java.lang.IllegalStateException:碎片已添加:ListFragment {42283f58#0 ID = 0x7f060094 de.myexample .demo.ui.ListFragment}
    在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
    在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
    在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1256)
    在android.os.Handler.dispatchMessage(Handler.java:99)
    在android.os.Looper.loop(Looper.java:137)
    在android.app.ActivityThread.main(ActivityThread.java:5103)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:525)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:737)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    在dalvik.system.NativeStart.main(本机方法)
java.lang.IllegalStateException:产生的原因片段已经补充说:ListFragment {42283f58#0 ID = 0x7f060094 de.myexample.demo.ui.ListFragment}
    在android.support.v4.app.FragmentManagerImpl.addFragment(的SourceFile:1175)
    在android.support.v4.app.BackStackRecord.run(的SourceFile:616)
    在android.support.v4.app.FragmentManagerImpl.execPendingActions(的SourceFile:1460)
    在android.support.v4.app.FragmentActivity.onStart(的SourceFile:556)
    在android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
    在android.app.Activity.performStart(Activity.java:5143)
    在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
    ... 11更多
java.lang.IllegalStateException:碎片已添加:ListFragment {42283f58#0 ID = 0x7f060094 de.myexample.demo.ui.ListFragment}
    在android.support.v4.app.FragmentManagerImpl.addFragment(的SourceFile:1175)
    在android.support.v4.app.BackStackRecord.run(的SourceFile:616)
    在android.support.v4.app.FragmentManagerImpl.execPendingActions(的SourceFile:1460)
    在android.support.v4.app.FragmentActivity.onStart(的SourceFile:556)
    在android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
    在android.app.Activity.performStart(Activity.java:5143)
    在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
    在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    在android.app.ActivityThread.access $ 600(ActivityThread.java:141)
    在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1256)
    在android.os.Handler.dispatchMessage(Handler.java:99)
    在android.os.Looper.loop(Looper.java:137)
    在android.app.ActivityThread.main(ActivityThread.java:5103)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:525)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:737)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    在dalvik.system.NativeStart.main(本机方法)
 

解决方案

好吧,我自己解决了

我把所有的碎片在的onPause()和存储在一些布尔值的状态。根据该布尔值的片段被放在在onResume()。比发射是稳定的活动,无论多么漫长的时间背景。

 布尔addList = FALSE;

@覆盖
保护无效onResume(){
    FragmentTransaction TX = this.getSupportFragmentManager()的BeginTransaction()。
    如果(this.addList){
        ListFragment列表= this.getListFragment();
        tx.add(R.id.MainFragmentContainer,名单,list_fragment_tag);
    }

    tx.commit();
    super.onResume();

    this.addList = FALSE;

}

@覆盖
保护无效的onPause(){
    this.addList = this.getListFragment()isAdded()。
    ...
    如果(this.addList){
        FragmentTransaction TX = this.getSupportFragmentManager()的BeginTransaction()。
        tx.remove(this.getListFragment());
        tx.commit();
    }
    this.getSupportFragmentManager()executePendingTransactions()。
    super.onPause();

}
 

也许这可以帮助别人同样的问题

I have a Problem with a Android App compiled and running with target SDK 4.3. The App has two Activities, a MainActivity which is also the Launcher Activity and a SecondActivity. Both are using Fragments. To Support older Devices also, the support lib is used.

In the following scenario it comes to the "IllegalStateException: Fragment already added" Error.

1) Start the app -> MainActivity is shown
2) switch to the SecondActivity with an Intent
3) Press the Home Button
4) Wait a longer time (tested with 24 hours)
5) press again the app icon -> Exception. If the time is shorter, the SecondActivity is shown like expected.

I have read a lot of the IllegalStateExceptions during Fragment handling, but all all of them pointed to a problem with a replace() method. In the Stacktrace, my own code is never called.

The Fragement is added in the Activies onCreate() Method:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(..);
    ListFragment listFragment = this.getCaptureListFragment();
    FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction();
    tx.add(R.id.MainFragmentContainer, listFragment, "list_fragment_tag");
    tx.commit(); 
}

private ListFragment getListFragment() {
    ListFragment listFragment = (ListFragment) this.getSupportFragmentManager().findFragmentByTag("list_fragment_tag");
    if (listFragment == null) {
        listFragment = new ListFragment();
    }
    return listFragment;
}


java.lang.RuntimeException: Unable to start activity    ComponentInfo{de.myexample.demo/de.myexample.demo.ui.SecondActivity}: java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment}
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment}
    at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1175)
    at android.support.v4.app.BackStackRecord.run(SourceFile:616)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1460)
    at android.support.v4.app.FragmentActivity.onStart(SourceFile:556)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
    at android.app.Activity.performStart(Activity.java:5143)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
    ... 11 more
java.lang.IllegalStateException: Fragment already added: ListFragment{42283f58 #0 id=0x7f060094 de.myexample.demo.ui.ListFragment}
    at android.support.v4.app.FragmentManagerImpl.addFragment(SourceFile:1175)
    at android.support.v4.app.BackStackRecord.run(SourceFile:616)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(SourceFile:1460)
    at android.support.v4.app.FragmentActivity.onStart(SourceFile:556)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
    at android.app.Activity.performStart(Activity.java:5143)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)

解决方案

Okay, solved in on my own.

I put all Fragments out in onPause() and store the state in some booleans. Depending on that booleans the Fragments are put in in onResume(). Than the launch is stable regardless how long the Activity was in the background.

boolean addList = false;

@Override
protected void onResume() {
    FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction();
    if (this.addList) {
        ListFragment list = this.getListFragment();
        tx.add(R.id.MainFragmentContainer, list, "list_fragment_tag");
    }

    tx.commit();
    super.onResume();

    this.addList = false;   

}

@Override
protected void onPause() {
    this.addList = this.getListFragment().isAdded();
    ...
    if (this.addList) {
        FragmentTransaction tx = this.getSupportFragmentManager().beginTransaction();
        tx.remove(this.getListFragment());
        tx.commit();
    }
    this.getSupportFragmentManager().executePendingTransactions();
    super.onPause();

}

Maybe that helps someone with the same problem

这篇关于java.lang.IllegalStateException:碎片已添加的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆