16

我正在使用优秀的ACRA库来接收来自我的应用程序的错误报告。

我从客户那里收到了很多关于 DialogFragment 中的 NPE 的报告,但我无法重现它:

java.lang.NullPointerException
at android.support.v4.app.DialogFragment.onActivityCreated(SourceFile:366)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:892)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1083)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1065)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(SourceFile:1844)
at android.support.v4.app.FragmentActivity.onStart(SourceFile:519)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
at android.app.Activity.performStart(Activity.java:4475)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1929)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
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:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

NPE 发生在支持库中(@line 366):

353    @Override
354    public void onActivityCreated(Bundle savedInstanceState) {
           (...)
361        View view = getView();
362        if (view != null) {
363            if (view.getParent() != null) {
364                throw new IllegalStateException("DialogFragment can not be attached             to a container view");
365            }
366            mDialog.setContentView(view);
367        }

我无法在我的任何设备(从 2.2 到 4.1.1)上重现该问题。由于没有引用我的任何代码,这是一个库错误吗?

4

6 回答 6

11

我不得不在一个项目中调试同样的问题。

通常对话框片段的使用如下

@Override
public Dialog onCreateDialog (Bundle savedInstanceState)
{
  //Create custom dialog
  return dialog;
}

尝试将其更新为以下

@Override
public Dialog onCreateDialog (Bundle savedInstanceState)
{
  //Create custom dialog
  if (dialog == null)
    super.setShowsDialog (false);

  return dialog;
}

这将阻止 DialogFragment.onAtivityCreated() 对 null 成员变量 mDialog 执行方法。

于 2013-04-11T12:42:59.547 回答
9

这是我在 StackOverflow 中看到的比较常见的崩溃,这是由于未正确创建对话框,导致 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

}

虽然上述情况可能比崩溃要好,但这并不能解决无法创建对话框的根本原因。这可能有很多原因,这就是需要调试的原因。

在我的情况下,我发现我需要实现 DialogFragment 的 onCreateDialog()而不是onCreateView() 才能 100% 正确地创建对话框。(onCreateView() 几乎总是可以创建对话框,但我证明存在可重现的极端情况,其中 onCreateView() 无法工作,导致 mDialog 变为 null。另一方面,我总是发现 onCreateDialog() 正确创建了 DialogFragment对话。)

于 2014-11-23T01:20:25.533 回答
2

DialogFragment.mDialogDialogFragment.dismiss()如果在被调用之前被调用,则可以为 null onActivityCreated()

于 2018-04-11T13:17:12.683 回答
1

我有NPE。

但是super.OnActivityCreated用a包围try/catch并没有帮助。

有帮助的是删除了复制示例留下的静态字段。因此,被覆盖的 DialogFragment 中没有静态字段。

于 2012-09-19T14:49:13.393 回答
0

不,这不对。这是 SetContentView 崩溃时的常见错误。setContentView 调用视图控件的构造函数。一个抛出了 nullPointerException。

于 2012-09-04T15:08:27.957 回答
0

如果您要覆盖 onCreateView(..) 来实例化 DialogFragment 的视图,则需要使用片段事务显示它并将 setShowsDialog 设置为 false 以避免此错误。IE:

            //Instantiate your DialogFragment and fragmentManager previously and then just do this:
            dialogFragment.setShowsDialog(false);
            FragmentTransaction fT = fragmentManager.beginTransaction();
            fT.add(0, dialogFragment, TAG);
            fT.commit();
于 2017-09-14T00:44:41.030 回答