Java Android DialogFragment,在终止/恢复应用程序后无法启动activity ComponentInfo
在一个非常具体的场景出现之前,我的应用程序运行良好Java Android DialogFragment,在终止/恢复应用程序后无法启动activity ComponentInfo,java,android,android-dialogfragment,android-inflate,Java,Android,Android Dialogfragment,Android Inflate,在一个非常具体的场景出现之前,我的应用程序运行良好 我打开对话框 我关闭应用程序(使用SystemTuner) 我在被杀后恢复应用程序 然后我的应用程序未运行,以下消息在LogCat中 07-05 20:45:36.469: W/ResourceType(4866): No package identifier when getting value for resource number 0x00000000 07-05 20:45:36.469: W/dalvikvm(4866): t
07-05 20:45:36.469: W/ResourceType(4866): No package identifier when getting value for resource number 0x00000000
07-05 20:45:36.469: W/dalvikvm(4866): threadid=1: thread exiting with uncaught exception (group=0x40a7b390)
07-05 20:45:36.469: E/AndroidRuntime(4866): FATAL EXCEPTION: main
07-05 20:45:36.469: E/AndroidRuntime(4866): java.lang.RuntimeException: Unable to start activity ComponentInfo{petersoft.petermemoflashcards/petermemo.android.gui.activities.MainActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x0
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1964)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1989)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.ActivityThread.access$600(ActivityThread.java:126)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1155)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.os.Looper.loop(Looper.java:137)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.ActivityThread.main(ActivityThread.java:4482)
07-05 20:45:36.469: E/AndroidRuntime(4866): at java.lang.reflect.Method.invokeNative(Native Method)
07-05 20:45:36.469: E/AndroidRuntime(4866): at java.lang.reflect.Method.invoke(Method.java:511)
07-05 20:45:36.469: E/AndroidRuntime(4866): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
07-05 20:45:36.469: E/AndroidRuntime(4866): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
07-05 20:45:36.469: E/AndroidRuntime(4866): at dalvik.system.NativeStart.main(Native Method)
07-05 20:45:36.469: E/AndroidRuntime(4866): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.content.res.Resources.getValue(Resources.java:1041)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.content.res.Resources.loadXmlResourceParser(Resources.java:2191)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.content.res.Resources.getLayout(Resources.java:880)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
07-05 20:45:36.469: E/AndroidRuntime(4866): at petermemo.android.gui.dialogs.PMDialogFragment.onCreateView(PMDialogFragment.java:51)
07-05 20:45:36.469: E/AndroidRuntime(4866): at petermemo.android.gui.dialogs.DialogCardStats.onCreateView(DialogCardStats.java:61)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.Activity.performStart(Activity.java:4475)
07-05 20:45:36.469: E/AndroidRuntime(4866): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1937)
07-05 20:45:36.469: E/AndroidRuntime(4866): ... 11 more
有一部分对话框代码:
public abstract class PMDialogFragment extends DialogFragment {
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(layoutId, container);
return view;
}
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance())
getDialog().setDismissMessage(null);
super.onDestroyView();
}
}
以下行导致异常:
View view = inflater.inflate(layoutId, container);
还请注意,正如我所说的,若应用程序并没有被杀死,那个么它完全可以正常工作。即使它被隐藏和恢复,也没有问题
我一点也不知道问题的原因是什么。。。请帮忙。:)
稍后添加:
我想知道这可能和layoutId等于零这一事实有关。我以前没有粘贴整个代码,但子类使用classPMDialogFragment
,方式如下:
public class DialogCardStats extends PMDialogFragment {
public static DialogCardStats newInstance (Fragment fragment, String fragmentTag, InterfaceCallback.Callback callback, Bundle bundle) {
FragmentManager fm = fragment.getFragmentManager();
DialogCardStats dialogCardStats = new DialogCardStats();
dialogCardStats.setArguments(bundle);
dialogCardStats.layoutId = R.layout.dialog_card_stats;
dialogCardStats.registerCallbackListener(callback);
dialogCardStats.show(fm, fragmentTag);
return dialogCardStats;
}
当使用n
eInstance
显示我的对话框时,则layoutId
设置正确。但是,当Android自动恢复时,layoutId
为零。如何保留重要的类字段?当系统使用已销毁的片段重新创建活动时,销毁时出现的片段将自动实例化并重新添加到活动的片段管理器中。然而,在这种情况下,实例化是通过反射进行的,即自动调用片段类的无参数构造函数。因此,此重新实例化不会通过newInstance
静态方法
本例中的错误——我个人确实在一个旧项目中犯了一个错误,因此我可以表示同情——是您通过直接赋值给实例变量来保存值,例如
dialogCardStats.layoutId = R.layout.dialog_card_stats;
而不是使用参数包。请参见,arguments bundle会自动保存和恢复,而在activity/fragment销毁和重新创建之后,这些实例变量永远不会恢复
正确的方法是利用arguments捆绑包,例如
bundle.putInt(ARG_LAYOUT_ID, R.layout.dialog_card_stats);
其中,ARG\u LAYOUT\u ID
是对话框cardstats
类中的私有静态最终变量(即常数),然后在onCreateView
中再次使用该常数来提取资源标识符,例如
int layoutId = getArguments().getInt(ARG_LAYOUT_ID);
View view = inflater.inflate(layoutId, container);
一切都应该正常运行。你为什么要“杀死”你的应用程序?来测试当Android杀死它时会发生什么。然后它会被正确地恢复吗?我所观察到的是,没有。Android不会“杀死”应用程序——它会干净地关闭它们。我不知道SystemTuner是什么,但如果它是一个任务杀手,那可能是你的问题。我刚刚扩展了问题描述。我觉得这和没有正确保存对话框状态有关。是的,没错。这似乎解决了问题。令人惊讶的是,我使用了您在其他对话框中提到的解决方案,但在这种情况下,我没有。。。。。谢谢你的帮助。