Android改配置项(字体大小)后返回应用时程序(Fragment)崩溃

来源:互联网 发布:淘宝库存手表是真是假 编辑:程序博客网 时间:2024/05/29 03:31

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: main06-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 public06-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 public06-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 more06-23 10:22:49.651: E/AndroidRuntime(21729): Caused by: java.lang.InstantiationException: can't instantiate class com.xxx.ModifyDetailsItemFragment; no empty constructor06-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


0 0
原创粉丝点击