1. 程式人生 > >android 帶fragment的Viewpager旋轉螢幕時異常退出

android 帶fragment的Viewpager旋轉螢幕時異常退出

a.lang.RuntimeException: Unable to start activity ComponentInfo{com.hdj.hookmanager/com.hdj.hookmanager.ManagerAllUserActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.hdj.hookmanager.fragment.DiviceFragmentTab: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime(22471):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2342)
E/AndroidRuntime(22471):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2404)
E/AndroidRuntime(22471):        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3968)
E/AndroidRuntime(22471):        at android.app.ActivityThread.access$900(ActivityThread.java:154)
E/AndroidRuntime(22471):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
E/AndroidRuntime(22471):        at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(22471):        at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(22471):        at android.app.ActivityThread.main(ActivityThread.java:5290)
E/AndroidRuntime(22471):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(22471):        at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(22471):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
E/AndroidRuntime(22471):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
E/AndroidRuntime(22471):        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:165)
E/AndroidRuntime(22471): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.hdj.hookmanager.fragment.DiviceFragmentTab: make sure class name exists, is public, and has an empty constructor that is public
E/AndroidRuntime(22471):        at android.support.v4.app.Fragment.instantiate(Fragment.java:431)
E/AndroidRuntime(22471):        at android.support.v4.app.FragmentState.instantiate(Fragment.java:101)
E/AndroidRuntime(22471):        at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1823)
E/AndroidRuntime(22471):        at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:264)
E/AndroidRuntime(22471):        at com.hdj.hookmanager.ManagerAllUserActivity.onCreate(ManagerAllUserActivity.java:43)
E/AndroidRuntime(22471):        at android.app.Activity.performCreate(Activity.java:6039)
E/AndroidRuntime(22471):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
E/AndroidRuntime(22471):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
E/AndroidRuntime(22471):        ... 12 more
E/AndroidRuntime(22471): Caused by: java.lang.InstantiationException: class com.hdj.hookmanager.fragment.DiviceFragmentTab has no zero argument constructor
E/AndroidRuntime(22471):        at java.lang.Class.newInstance(Class.java:1597)
E/AndroidRuntime(22471):        at android.support.v4.app.Fragment.instantiate(Fragment.java:420)
E/AndroidRuntime(22471):        ... 19 more
E/AndroidRuntime(22471): Caused by: java.lang.NoSuchMethodException: <init> []
E/AndroidRuntime(22471):        at java.lang.Class.getConstructor(Class.java:531)
E/AndroidRuntime(22471):        at java.lang.Class.getDeclaredConstructor(Class.java:510)
E/AndroidRuntime(22471):        at java.lang.Class.newInstance(Class.java:1595)

E/AndroidRuntime(22471):        ... 20 more

解決辦法 在Activity上新增:

<activity android:name="com.hdj.hookmanager.ManagerAllUserActivity"
            android:configChanges="keyboardHidden|orientation|screenSize">

使Android橫豎屏切換時不銷燬當前activity

對android:configChanges的總結
1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次(在三星4.0裝置上切橫屏和豎屏都是執行一次,而並非這裡說的有執行兩次的情況);

2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次;
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。
注:上述描述是在Android3.2以前,如果缺少了keyboardHidden選項,不能防止Activity的銷燬重啟,也就不能執行onConfigurationChanged方法了。在3.2之後,必須加上screenSize屬性才可以遮蔽呼叫Activity的生命週期(一些裝置上可以不需要keyboardHidden,只要screenSize就可以了,保守起見還是繼續保留keyboardHidden吧)。

Andorid 3.2以前的SDK可以使用如下配置
android:configChanges="orientation|keyboardHidden"
而Adnroid 3.2以後的SDK必須新增一個screenSize屬性,具體如下
android:configChanges="keyboardHidden|orientation|screenSize"
或者
android:configChanges="orientation|screenSize"