[英]Android DialogFragment and Unable to start activity ComponentInfo after killing/restoring app
在一個非常具體的場景之前,我的應用程序運行良好。
然后我的應用程序沒有運行,以下消息在 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;
}
當我的對話框使用ewInstance
顯示時, layoutId
設置正確。 但是,當它由 Android 自動恢復時, layoutId
為零。 我應該如何保留重要的類字段?
當系統使用已銷毀的片段重新創建活動時,銷毀時存在的片段會自動實例化並重新添加到活動的片段管理器中。 然而,在這種情況下,實例化是通過反射發生的,即自動調用片段類的無參數構造函數。 因此,這種重新實例化沒有通過您newInstance
靜態方法。
在這種情況下的錯誤 - 我個人在一個舊項目中犯過的錯誤,所以我可以同情 - 是您通過直接分配給實例變量來保存值,例如
dialogCardStats.layoutId = R.layout.dialog_card_stats;
而不是使用參數包。 看,參數包會自動為您保存和恢復,而這些實例變量在活動/片段銷毀和重新創建后永遠不會恢復。
正確的做法是利用參數包,例如
bundle.putInt(ARG_LAYOUT_ID, R.layout.dialog_card_stats);
其中ARG_LAYOUT_ID
是一個私有靜態最終變量(即一個常數)在DialogCardStats
類,然后再次用恆定在onCreateView
以提取資源標識符,例如
int layoutId = getArguments().getInt(ARG_LAYOUT_ID);
View view = inflater.inflate(layoutId, container);
一切都應該運行良好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.