非常简单的代码,但使用Fragment时出现错误“Activity已被破坏”

我做了一个非常简单的Activity ,它显示了一个简单的ListFragment,如下所示:

我的活动:

public class MyActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { FragmentManager fragMgr = getSupportFragmentManager(); FirstFragment list = new FirstFragment(); fragMgr.beginTransaction().add(android.R.id.content, list).commit(); } } 

我的ListFragment:

 public class FirstFragment extends ListFragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { inflater.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.main, null); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); String listContent[] = {"Larry", "Moe", "Curly"}; setListAdapter(new ArrayAdapter(getActivity(), R.layout.list_item, listContent)); } ... } 

当我启动我的应用程序时,我收到错误消息

  java.lang.IllegalStateException: Activity has been destroyed E/AndroidRuntime( 947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) E/AndroidRuntime( 947): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) E/AndroidRuntime( 947): at android.app.ActivityThread.access$2200(ActivityThread.java:119) E/AndroidRuntime( 947): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) E/AndroidRuntime( 947): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 947): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 947): at android.app.ActivityThread.main(ActivityThread.java:4363) E/AndroidRuntime( 947): at java.lang.reflect.Method.invokeNative(Native Method) ... 

它抱怨活动已被破坏为什么???

PS main.xml:

   

Solutions Collecting From Web of "非常简单的代码,但使用Fragment时出现错误“Activity已被破坏”"

我也遇到过类似的问题。
我意识到发生这种情况是因为当FragmentTransaction即将获得.commit() ,活动正在被破坏。

解决此问题的方法是检查Activity.isFinishing()是否为true。

 if (!isFinishing()) { FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.replace(SOME_RES_ID, myFragmentInstance); ft.commit(); } 

我想通了自己,这是因为我错过了super.onCreate(savedInstanceState); 在我的Activity onCreate()方法中。 添加完之后,一切都很好。

我遇到了同样的问题,无法修复它。 事件我添加了isFinishing()检查。 但没有运气。

然后我又添加了一个检查isDestroyed ()并且它现在工作正常。

 if (!isFinishing() && !isDestroyed()) { FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.replace(LAYOUT_ID, myFragmentInstance); ft.commit(); } 

要说明一下:

框架创建Activity并调用Activity.onCreate()

Activity.onCreate()将以某种方式附加到FragmentManager ,让它知道托管活动。 Activity.onDestroy()将再次注销它。

现在,您扩展Activity并覆盖onCreate() 。 您调用FragmentManager而不调用Activity.onCreate() 。 不执行上面解释的整个注册逻辑。 因此, FragmentManager对该活动一无所知,并假定它已被销毁并使用误导性错误消息生成exception。

为了确保我看到这一点,MyActivity是您尝试启动的活动,然后添加FirstFragment实例,对吧?

我马上看到你需要注意的两件事

1)在你的活动中,你永远不会调用setContentView()或super.onCreate()。 第一次调用对你来说可能是个大问题,因为这意味着你的布局永远不会膨胀,因此,Rvariables不存在

2)您的MyActivity需要有自己的xml布局文件,它没有。

我做的是在我打电话后立即做的

fragmentManager.executePendingTransactions();

并且在onpause()之后永远不要尝试提交

阅读此Artical Fragment交易和活动状态损失

还不错,因为得到错误“活动已被破坏”

 ava.lang.IllegalStateException: Activity has been destroyed fragmentTransaction.commitAllowingStateLoss(); 

所以我的解决方案是添加检查if (!isFinishing()&&!isDestroyed())

  if (!isFinishing()&&!isDestroyed()) { fragmentTransaction.commitAllowingStateLoss(); } } 

如果有人遇到类似的问题:

我面临同样的问题,但在我的主要活动中,我调用Fragment1然后如果用户点击Fragment1 Layout我想启动另一个Fragment2布局。

我能够从Main活动启动Fragment1但是Fragment1到Fragment2它因为“Activity已经被破坏”而失败了。

我通过在MainActivity类中将FragmentManager对象保持为静态来解决上述问题。 private static FragmentManager mfragmentManager = null;

使用相同的上述对象调用这两个片段,解决了我的问题。

下面是我的主要活动的片段切换代码。

 public void switchToFragment(String fragmentName){ Fragment fragment = null; switch (fragmentName) { case "Fragment1":{ fragment = new Fragment1(); break; } case "Fragment2": { fragment = new Fragment2(); break; } } FragmentTransaction transaction = mfragmentManager.beginTransaction(); transaction.replace(R.id.fragment_container, fragment); transaction.commit(); } 

super.onCreate(savedInstanceState)将调用FragmentActivity中的onCreate方法,该方法将调用mFragments.attachHost(null /*parent*/);

当你调用FragmentTransaction.commit()时,这句话将为FragmentController中的mHost赋值,

在方法enqueueAction() ,它有这个句子

  if (mDestroyed || mHost == null) { throw new IllegalStateException("Activity has been destroyed"); } 

因此,如果在提交fragmentTransaction之前没有调用super.onCreate(savedInstanceState),则会出现此exception,因为mHost为null