web-dev-qa-db-ja.com

フラグメントにAlertDialogを表示する方法は?

アプリに警告ダイアログを表示したい。フラグメントを使用しています。私はこれを行うために以下のコードを試しました:

 AlertDialog ad = new AlertDialog.Builder(context)
            .create();
    ad.setCancelable(false);
    ad.setTitle(title);
    ad.setMessage(message);
    ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
ad.show();

しかし、それはクラッシュしており、logcatのエラーは次のとおりでした:

04-18 18:23:01.770:E/AndroidRuntime(9424):Android.view.WindowManager $ BadTokenException:ウィンドウを追加できません-トークンnullはアプリケーション用ではありません

インターネットから、クラッシュはコンテキストの問題が原因であることがわかりました。私はコンテキストを

context = this.getActivity().getApplicationContext();

私はこれの何が問題なのか分かりません。誰も私を助けることができますか?

54
andro-girl

contextgetActivity()に置き換えます。

ApplicationContextは、ダイアログの作成などのタスクには使用しないでください。フラグメントにいるので、代わりにFragments getActivity()メソッドを呼び出すだけでActivity-Contextを取得できます。

125
Jave

この質問に関する詳細情報(フラグメント内のアラートダイアログ、イベント内で管理):

OnClick(View v)やonLongClick(View v)などのイベント内でAlertDialogを呼び出すと、次を使用できます。

public boolean onClick(View v) {
    ...
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
    ...
}
13
JDCoder

DialogFragmentを使用してみてください。フラグメントを使用すると、DialogFragmentの方が優れています

9
FUBUs

フラグメントからAlertDialogを作成しようとしていたのと同様の問題がありました。それからNullPointerExceptionが発生しました。最初は次のようにしました。

_AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
_

NullPointerExceptionは、コードの後半でalertDialog.show()を呼び出すときに特に発生しました。しかし、ドキュメントでAlertDialog.Builder()を検索した後、それを初期化する別の方法があるように見えました [AlertDialog.Builder Doc]

_AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();
_

これにより、手元のNullPointerExceptionが解決されました。これがあなたにも役立つことを願っています!

1
Syuqri

ListView内のアダプターで使用したため、getActivity()を使用できませんでした。動作させるために、フラグメント内のアダプターのインスタンス化のコンテキストにgetActivity()を使用しました。

_this.adapter = new myAdapter(getActivity(), factory);
_

後で他のクラス(アダプターのクラス)でgetContext()を使用することができ、機能しました。

0
Hanan N