開發時代碼設計如下: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