解決Fragment相關問題,java-lang-illegalstateexception-activity-has-been-destroyed

開發時代碼設計如下:FragmentActivity包含一個Fragment A ,B,C, 該Fragment A 中包含一個Viewpager+FragmentPagerAdapter的組合,當在Fragment A,B,C中切換時,遇到以下錯誤

錯誤1:java.lang.IllegalStateException: Recursive entry to executePendingTransactions

按照網上的解決辦法是,創建FragmentPagerAdapter 對象時,需使用getChildFragmentManager()方法替代getFragmentManager();

如:ListViewFragmentAdapter adapter = new ListViewFragmentAdapter(getChildFragmentManager());

viewpager.setAdapter(adapter);


改完之後運行,還是報錯,但是是新錯誤

錯誤2:java.lang.illegalstateexception: activity has been destroyed

stackoverflow上面給的解決辦法是重寫onDetach方法,但經測試行不通,真正的解決辦法:

在使用該Viewpager的Fragment中,重寫方法

@Override
public void onDestroyView() {
// TODO Auto-generated method stub
super.onDestroyView();
try {
       Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
       childFragmentManager.setAccessible(true);
       childFragmentManager.set(this, null);


    } catch (NoSuchFieldException e) {
       throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
       throw new RuntimeException(e);
    }
}


爲什麼在onDetach行不通呢,因爲按照activity跟fragment的生命週期圖來看,onDetach階段fragment已經與activity脫離關係即fragment持有的activity對象已被置null,而onDestroyView階段fragment中仍然保留與activity之間的關係,此時fragment持有的activity對象仍然有效。。親測程序正常運行


解決方法參考自:http://stackoverflow.com/questions/15207305/getting-the-error-java-lang-illegalstateexception-activity-has-been-destroyed



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章