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

プロジェクトで同じ問題をデバッグする必要がありました。

通常、Dialog フラグメントは以下のように使用されます

@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 が 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

}

上記はおそらくクラッシュよりも優れていますが、これはダイアログの作成に失敗した根本的な原因には対処していません。これには多くの理由が考えられ、それをデバッグする必要があります。

私の状況では、100% の確率でダイアログを適切に作成するには、onCreateView ()の代わりにDialogFragment の onCreateDialog() を実装する必要があることがわかりました。(onCreateView() はほとんどの場合、ダイアログを作成するために機能しますが、onCreateView() が機能せず、mDialog が null になるという再現可能なまれなケースがあることを証明しました。一方、onCreateDialog() が DialogFragment のダイアログ。)

于 2014-11-23T01:20:25.533 に答える
1

私はNPEを持っていました。

しかし、 を で囲んでsuper.OnActivityCreatedtry/catch役に立ちませんでした。

役に立ったのは、例をコピーして残った static フィールドを削除したことです。したがって、オーバーライドされた DialogFragment 内に静的フィールドはありません。

于 2012-09-19T14:49:13.393 に答える
0

いいえ、ちがいます。これは、SetContentView がクラッシュした場合の一般的なエラーです。setContentView は、ビューのコントロールのコンストラクターを呼び出します。1 つは nullPointerException をスローしました。

于 2012-09-04T15:08:27.957 に答える