java.lang.IllegalStateException崩溃处理——4种情形
此文包含java.lang.IllegalStateException的4種情形:
-
1.java.lang.IllegalStateException: Fragment already added
-
**2.java.lang.IllegalStateException: Fragment MyFragment{xxx} not attached to Activity **
-
3.java.lang.IllegalStateException: Fragment already active
-
**4.java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
**
問題1:java.lang.IllegalStateException: Fragment already added異常的處理。
當快速雙擊調用FragmentTransaction.add()方法添加fragmentA,而fragmentA不是每次單獨生成的,就會引起這個異常。
DialogFragment.show()內部調用了FragmentTransaction.add()方法,所以調用DialogFragment.show()方法時候也可能會出現這個異常。
解決方法:
在add()方法時候,先判斷fragmentA.isAdded(),
如下調用可以避免該異常:
?
if(!fragmentA.isAdded()){FragmentManager manager = ((FragmentActivity)context).getSupportFragmentManager();FragmentTransaction ft = manager.beginTransaction();ft.add(fragmentA, "fragment_name");ft.commit(); }參考:
http://stackoverflow.com/questions/6250580/fragment-already-added-illegalstateexception/6266144#6266144
問題2:java.lang.IllegalStateException: Fragment MyFragment{410f6060} not attached to Activity
出現該異常,是因為Fragment的還沒有Attach到Activity時,調用了如getResource()等,需要上下文Content的函數。
解決方法:
就是等將調用的代碼寫在OnStart()中。
另外一種解決方法:
主要是在調用:getResources().getString(R.string.app_name); 之前增加一個判斷isAdded(),
參考:
http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity
http://stackoverflow.com/questions/6870325/android-compatibility-package-fragment-not-attached-to-activity
問題3:java.lang.IllegalStateException: Fragment already active
在 Fragment 沒有被添加到 FragmentManager 之前,我們可以通過 Fragment.setArguments() 來設置參數,并在 Fragment 中,使用 getArguments() 來取得參數。在 Fragment 被添加到 FragmentManager 后,一旦被使用,我們再次調用 setArguments() 將會導致 java.lang.IllegalStateException: Fragment already active 異常。
解決方法:
可以使用setter和getter方法進行數據的存儲和獲取。
?
/**看幾個關鍵點,getItem方法返回新建的Fragment對象, *instantiateItem方法先調用父類的方法獲得已經存在的Fragment, *然后用Fragment中的setter添加屬性, *在getItemPosition方法中總是返回POSITION_NONE。 */ 1 @Override 2 public Fragment getItem(int position) { 3 MyFragment f = new MyFragment(); 4 return f; 5 } 6 7 @Override 8 public Object instantiateItem(ViewGroup container, int position) { 9 MyFragment f = (MyFragment) super.instantiateItem(container, position); 10 String title = mList.get(position); 11 f.setTitle(title); 12 return f; 13 } 14 15 @Override 16 public int getItemPosition(Object object) { 17 return PagerAdapter.POSITION_NONE; 18 }參考:
http://fattycat.me/something-about-fragment/(推薦閱讀)
http://stackoverflow.com/questions/10364478/got-exception-fragment-already-active/15084683
問題4:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
在使用Fragment保存參數的時候,可能是因為需要保存的參數比較大或者比較多,這種情況下頁會引起異常。比如代碼:
?
Bundle b = new Bundle(); b.putParcelable("bitmap", bitmap2); imageRecognitionFragment.setArguments(b);設置好參數,并且添加hide(),add(),方法之后,需要commit(),來實現兩個Fragment跳轉的時候,這種情形下參數需要進行系統保存,但是這個時候你已經實現了跳轉,系統參數卻沒有保存。此時就會報java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState異常。
分析原因:
你并不需要系統保存的參數,只要你自己設置的參數能夠傳遞過去,在另外一個Fragment里能夠順利接受就行了,現在android里提供了另外一種形式的提交方式commitAllowingStateLoss(),從名字上就能看出,這種提交是允許狀態值丟失的。到此問題得到完美解決,值的傳遞是你自己控制的。
解決方法:
將commit()改成commitAllowingStateLoss()即可。這里也說一下另外一個問題,bitmap 也可以通過Bundle傳遞的,使用putParacelable就可以了。
總結
以上是生活随笔為你收集整理的java.lang.IllegalStateException崩溃处理——4种情形的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IO_ADDRESS()的实现【转】
- 下一篇: 统计学习方法 学习笔记(五):支持向量机