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

我做了一个非常简单的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<String>(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:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="8dp" android:paddingRight="8dp"> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="next" /> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#00FF00" android:layout_weight="1" android:drawSelectorOnTop="false" /> <TextView android:id="@android:id/empty" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FF0000" android:text="No data" /> </LinearLayout> 

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

我也遇到类似的问题。
我意识到这是因为在FragmentTransaction即将获取.commit() ,活动被破坏。

解决scheme是检查Activity.isFinishing()是否为真。

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

给出一个解释:

该框架创buildActivity并调用Activity.onCreate()

Activity.onCreate()会以某种方式附加到FragmentManager让它知道主办活动。 Activity.onDestroy()将再次取消注册。

现在,扩展Activity并覆盖onCreate() 。 您可以调用FragmentManager而无需调用Activity.onCreate() 。 上面解释的整个注册逻辑不被执行。 因此, FragmentManager不知道任何有关该活动的信息,并假定它已被销毁,并产生具有误导性错误信息的exception。

只是为了确保我看到这个权利,MyActivity是你试图启动的活动,然后添加一个FirstFragment的实例,对吧?

我立即看到两件事你需要看

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

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

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

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

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

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

我所做的是立即在我致电后

fragmentManager.executePendingTransactions();

并且在onpause()之后从不尝试提交

阅读这个Artical Fragment Transactions&Activity State Loss

  super.onCreate(savedInstanceState) will call onCreate method in FragmentActivity,which will call mFragments.attachHost(null /*parent*/); this sentence will assign a value to 'mHost' in FragmentController,when you calls FragmentTransaction.commit() , in the method 'enqueueAction()',it has this sentences ``` if (mDestroyed || mHost == null) { throw new IllegalStateException("Activity has been destroyed"); } ``` so if you haven't call super.onCreate(savedInstanceState) before you commit a fragmentTransaction,you will get this exception because mHost is null 

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

我面临同样的问题,但在我从主要活动的情况下,我打电话给Fragment1,然后如果用户点击Fragment1布局我想启动另一个Fragment2布局。

我能够从主要活动启动Fragment1,但Fragment1到Fragment2这是因为“活动已被破坏”的exception失败。

我通过在MainActivity类中将FragmentManager对象保持为静态来解决上述问题。 私人静态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(); }