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

在一个非常具体的场景出现之前,我的应用程序运行良好

  • 我打开对话框
  • 我关闭应用程序(使用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): 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等于零这一事实有关。我以前没有粘贴整个代码,但子类使用class
    PMDialogFragment
    ,方式如下:

    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是什么,但如果它是一个任务杀手,那可能是你的问题。我刚刚扩展了问题描述。我觉得这和没有正确保存对话框状态有关。是的,没错。这似乎解决了问题。令人惊讶的是,我使用了您在其他对话框中提到的解决方案,但在这种情况下,我没有。。。。。谢谢你的帮助。