Android支持库v4 DialogFragment导致应用程序崩溃

3

我从错误日志中得知,我的应用程序在崩溃时出现了以下异常:

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

我无法重现它,而且导致崩溃的日志似乎并没有显示任何DialogFragment这是支持库中导致崩溃的代码行


1
请展示用于创建和显示对话框的代码。 - Rick Falck
一个NullPointerException似乎是导致你的问题,请发布你的代码,特别是异常发生的部分,这样我们才能帮助你解决问题。 - Xaver Kapeller
getActivity() 返回 null,这意味着 DialogFragment 没有附加到一个 Activity 上。请发布调用 DialogFragment 的代码。 - Benito Bertoli
我大约有5个可能会被显示的DialogFragment。无论是崩溃堆栈跟踪还是我的日志,都没有任何迹象表明是哪个DialogFragment,因此我无法为它发布代码。 - Eliezer
1
当您的对话框正在显示时旋转屏幕会导致此问题,请参见我的问题:https://dev59.com/9nvaa4cB1Zd3GeqPJvFg - Matt Wolfe
显示剩余3条评论
2个回答

2
mDialog为空,这意味着您的对话框未被正确创建。我曾经遇到过相同的情况,但只有在非常有限的情况下才会发生(与屏幕旋转无关,但是我可以100%地复现),并且它与onCreateView()未能正确创建对话框有关,导致mDialog为空。onCreateView()可用于创建对话框--甚至http://developer.android.com/reference/android/app/DialogFragment.html的基本对话框部分都显示了这一点--但我证明它并不总是可靠的。然而,在我的崩溃场景中,我发现使用onCreateDialog()而不是onCreateView()将始终起作用,即使我正在使用与onCreateView()相同的布局和数据。因此,当将DialogFragment用作对话框时,我更改了代码以使用onCreateDialog(),并解决了该问题。所以这是您可能想要检查的一件事。
如果您想要一种粗暴的方法来停止崩溃(尽管mDialog为空的根本原因仍然存在),则可以使用此代码--直到我发现上述真正问题之前,我已成功使用此代码:
@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
这里的答案是: DialogFragment: NullPointerException (支持库) 添加以下代码:
@Override
public Dialog onCreateDialog (Bundle savedInstanceState)

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

  return dialog;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接