Android改配置項(字體大小)後返回應用時程序(Fragment)崩潰

RT,

昨天碰到的BUG.Android改配置項(字體大小)後返回應用時程序(Fragment)崩潰

1.Activity中有一個Fragment,代碼:

XXXActivity{
	FragmentTransaction ft = getFragmentManager().beginTransaction();
	keypadFragment = new ModifyDetailsItemFragment(params);
	ft.add(R.id.frame_keypad, keypadFragment);
	ft.commit();
}

2.切到系統設置畫面,修改系統字體大小:小->大

3.切回程序,程序崩潰

06-23 10:22:49.651: E/AndroidRuntime(21729): FATAL EXCEPTION: main
06-23 10:22:49.651: E/AndroidRuntime(21729): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx/com.xxx.XXXActivity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.xxx.ModifyDetailsItemFragment: make sure class name exists, is public, and has an empty constructor that is public
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1992)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2017)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3405)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread.access$800(ActivityThread.java:132)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1181)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.os.Handler.dispatchMessage(Handler.java:99)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.os.Looper.loop(Looper.java:137)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread.main(ActivityThread.java:4507)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at java.lang.reflect.Method.invokeNative(Native Method)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at java.lang.reflect.Method.invoke(Method.java:511)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at dalvik.system.NativeStart.main(Native Method)
06-23 10:22:49.651: E/AndroidRuntime(21729): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.xxx.ModifyDetailsItemFragment: make sure class name exists, is public, and has an empty constructor that is public
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.Fragment.instantiate(Fragment.java:585)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.FragmentState.instantiate(Fragment.java:96)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1682)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.Activity.onCreate(Activity.java:864)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at com.xxx.XXXActivity.onCreate(XXXActivity.java:594)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.Activity.performCreate(Activity.java:4480)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	... 12 more
06-23 10:22:49.651: E/AndroidRuntime(21729): Caused by: java.lang.InstantiationException: can't instantiate class com.xxx.ModifyDetailsItemFragment; no empty constructor
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at java.lang.Class.newInstanceImpl(Native Method)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at java.lang.Class.newInstance(Class.java:1319)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	at android.app.Fragment.instantiate(Fragment.java:574)
06-23 10:22:49.651: E/AndroidRuntime(21729): 	... 19 more

解決辦法:

在Fragment中加入以下代碼:

     public void onCreate(Bundle savedInstanceState) {  
            super .onCreate(savedInstanceState);  
  
            // 把這個加上!!!
            setRetainInstance( true );  
        }  

結論:

(以下爲推測)

根本原因是參數是通過構造方法傳入Fragment的,而不是Fragment.setArguments(Bundle bundle),因此配置項變了後實例化一個新的Fragment,並且給mArgments初始化爲原先的值,而原來的Fragment實例的數據都丟失了,並重新進行了初始化.


參考:


http://blog.csdn.net/tu_bingbing/article/details/9274289

http://blog.csdn.net/tu_bingbing/article/details/24143249


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