Android支持v4 DialogFragment崩溃应用程序

时间:2013-11-20 20:10:46

标签: android android-fragments android-dialogfragment android-support-library

我从我的应用程序崩溃时发送的错误日志中收到此异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{<my activity>}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3553)
    at android.app.ActivityThread.access$700(ActivityThread.java:140)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1233)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4898)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at android.support.v4.app.DialogFragment.onActivityCreated(DialogFragment.java:368)
    at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1486)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
    at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1877)
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:552)
    at <my FragmentActivity wrapper>.onStart(BaseActivity.java:16)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1167)
    at android.app.Activity.performStart(Activity.java:5216)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2073)
    ... 12 more

我无法重现它,导致此崩溃的日志似乎并不表示显示了任何DialogFragmentThis is the line in the support library that is causing the crash

2 个答案:

答案 0 :(得分:2)

mDialog为null,表示您的对话框未正确创建。我有相同的情况会发生这种情况,但在非常有限的情况下(与屏幕旋转无关,但它是我可以100%重现的东西),它与onCreateView()没有正确创建对话框,导致null mDialog。 onCreateView()可以用来创建一个对话框 - http://developer.android.com/reference/android/app/DialogFragment.html的基本对话框部分甚至显示了这一点 - 但我证明它并不总是可靠的。但是,在我的崩溃场景中,我发现使用onCreateDialog()而不是onCreateView()将始终有效,即使我使用的是与onCreateView()使用的布局和数据相同的布局和数据。因此,当我将DialogFragment用作对话框并解决了问题时,我将代码更改为使用onCreateDialog()。所以这是你可能要检查的一件事。

如果你想要一个强力方法来阻止崩溃(虽然为什么mDialog为null的根本原因仍然存在),你可以使用这个代码 - 我成功使用这个代码,直到我找到上面的真正问题:

@Override
public void onActivityCreated(Bundle arg0) {
    if (getDialog() == null ) {  // Returns mDialog
        // Tells DialogFragment to not use the fragment as a dialog, and so won't try to use mDialog
        setShowsDialog( false ); 
    } 
    super.onActivityCreated(arg0);  // Will now complete and not crash

}

答案 1 :(得分:1)

答案在这里: DialogFragment : NullPointerException (support library)

添加此代码:

@Override
public Dialog onCreateDialog (Bundle savedInstanceState)

  //Create custom dialog
  if (dialog == null)
    super.setShowsDialog (false);

  return dialog;
}