1
我有一个片段,它调用setRetainInstance(true)
,这样它就不会在方向更改时重新创建。它确实有而不是有一个公共的空构造函数。我的印象是,该框架将永远不会(重新)创建具有setRetainInstance(true)
应用了片段下,但是,我已经收到异常,指出正在创建它:由Android框架构建的保留片段(没有空的构造函数)
java.lang.RuntimeException: Unable to start activity ComponentInfo{<foo>/<foo>.Activity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment <foo>.SomeFragment: make sure class name exists, is public, and has an empty constructor that is public
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2063)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088)
at android.app.ActivityThread.access$600(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4744)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment <foo>.SomeFragment.d: make sure class name exists, is public, and has an empty constructor that is public
at android.app.Fragment.instantiate(Fragment.java:588)
at android.app.FragmentState.instantiate(Fragment.java:97)
at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1732)
at android.app.Activity.onCreate(Activity.java:883)
at <foo>.Activity.onCreate(SourceFile:57)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088)
at android.app.ActivityThread.access$600(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4744)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.InstantiationException: cannot instantiate class <foo>.SomeFragment; no empty constructor
at java.lang.Class.newInstanceImpl(Class.java)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Fragment.instantiate(Fragment.java:577)
at android.app.FragmentState.instantiate(Fragment.java:97)
at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1732)
at android.app.Activity.onCreate(Activity.java:883)
at <foo>.Activity.onCreate(SourceFile:57)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088)
at android.app.ActivityThread.access$600(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4744)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(NativeStart.java)
我的问题是双重的:
- Android框架在哪些情况下创建这些片段?我有一个预感,当一个活动关闭,垃圾收集和后来打开。
- 我是否会修正这个bug,如上面的例外报告所示,通过使用bundle将参数传递给fragment? (如图an answer to "Do fragments really need an empty constructor?")
我使用开发人员选项'不要保留活动'在我的手机上以达到错误状态。打开它,然后让片段显示并离开活动。活动被破坏。现在使用最近的任务列表重新输入,然后应用程序应该崩溃。 – foens