在一种非常特殊的情况下,我的应用程序可以正常工作。


我打开对话框。
我杀死了该应用程序(使用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等于零的事实有关。我之前没有粘贴整个代码,但是子类使用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 ewInstance显示我的对话框时,则layoutId设置正确。但是,当它由Android自动恢复时,layoutId为零。我应该如何保留重要的课堂领域?

最佳答案

当系统使用已销毁的碎片重新创建活动时,销毁时存在的碎片将自动实例化并重新添加到活动的碎片管理器中。但是,在这种情况下,实例化是通过反射发生的,即自动调用片段类的no-arg构造函数。因此,此重新实例化不会通过您的newInstance静态方法。

这种情况下的错误-我个人确实在一个旧项目中提交过一个错误,因此我可以同情-是您通过直接分配给实例变量来保存值,例如

dialogCardStats.layoutId = R.layout.dialog_card_stats;


而不是使用参数束。可以看到,参数束是为您自动保存和恢复的,而那些实例变量在活动/碎片销毁和重新创建之后再也不会恢复。

正确的方法是利用参数束,例如

bundle.putInt(ARG_LAYOUT_ID, R.layout.dialog_card_stats);


其中ARG_LAYOUT_IDDialogCardStats类中的私有静态最终变量(即常量),然后再次使用onCreateView中的常量提取资源标识符,例如

int layoutId = getArguments().getInt(ARG_LAYOUT_ID);
View view = inflater.inflate(layoutId, container);


一切应该运行正常。

10-08 17:51
查看更多