Android「ウィンドウを追加できません—トークンnullはアプリケーション用ではありません」例外


134

ダイアログを開こうとすると、次のAndroid例外が発生します。誰かが私に何が起こっているのかを理解するのを手伝ってくれませんか?どうすればこの問題を修正できますか?

android.view.WindowManager$BadTokenException: 
  Unable to add window -- token null is not for an application
    at android.view.ViewRoot.setView(ViewRoot.java:509)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
    at android.app.Dialog.show(Dialog.java:241)

8
コードを投稿せずにどのように知るべきですか?
Falmarri、2011年


1
この回答を参照してください。この回答のリンクを投稿する主なことは、この回答がコメントされていることで、この問題が発生する理由とそれを処理するための最良の方法は何かについて説明しているhttp://stackoverflow.com/a/です。 7229248/501483
ダラム2013

サービスを使用する場合は、stackoverflow.com / questions / 23516689 / …をお読みください。
CoolMind 2016

回答:


421

私は推測しています-あなたはアプリケーションコンテキストでダイアログを作成しようとしていますか?このようなもの:

new Dialog(getApplicationContext());

これは間違っています。アクティビティコンテキストを使用する必要があります。

あなたは次のように試す必要があります:

new Dialog(YourActivity.this);

1
ありがとう。しかし、私はnew Dialog(getApplicationContext());を使用しませんでした。'new AlertDialog.Builder(mContext);'のみを使用します ここで、mContextはアクティビティへの参照です。
マイケル

10
次に、mContextはMyActivity.thisである必要があります。
Luis

10
カスタムダイアログを作成するためのAndroidドキュメント(developer.android.com/guide/topics/ui/dialogs.html#CustomDialog)には、このエラーがあります。コンテキストmContext = getApplicationContext(); ダイアログDialog = new Dialog(mContext); あなたの修正はDialog dialog = new Dialog(this);につながります。うまくいきました!ありがとう
bnieland '21 / 09/21

1
developer.android.com/guide/topics/ui/dialogs.htmlが修正されました(しばらくの間)。参照のためにこれを指摘するだけです。パターンも改善されました。:)
Martin Marconcini 2013年

2
getActivity()@SagarDevangaを使用
Pratik Butani 2014

34

を引き続き使用できますが、使用するgetApplicationContext()前に、このフラグを追加する必要があります。dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)があります。そうすると、エラーは表示されません。

そして、許可を追加することを忘れないでください:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

はい、それは非常に簡単です。許可を追加することを忘れないでください、私はたった今編集しました。
codezjx

3
RecyclerAdapterでgetActivity()を使用できない
Martin Erlic

それは素晴らしいです:)
Syed Hamza Hassan

どのようにフラグを追加しますか?
コナー・ダッセン

13

私の場合、私は次のようなダイアログを作成しようとしました:

new Dialog(getApplicationContext());

だから私は変更する必要がありました:

new Dialog(this);

そしてそれは私にとってはうまくいきます;)


1
正解ですが、アクティビティスコープ内にいる場合にのみ機能します。内部スコープにいる場合は、が別のオブジェクトを参照しているため、MyActivity.classではなくを使用する必要があります。thisthis
Shahar

1
また、テーマthisを確実にDialog継承します。
TheRealChx101 2015年

12

それが機能することを願って、それは私のために機能したようにgetParent()、のcontextような議論の場所で試してみてくださいnew AlertDialog.Builder(getParent());


なぜgetParent()を使用するのですか?
ホセ・カストロ

2
Activityクラスを拡張しない別のクラスでダイアログを表示しているため、Activityを拡張しているそのクラスのコンテキストを取得できない場合があります。したがって、ダイアログを表示しようとしているがアクティビティを拡張しないクラス内のコンテキストを取得するには、その上位のアクティビティのコンテキストを返すgetParent()を使用できます。
Priyank Joshi

1
@PriyankJoshiのおかげで、1日を節約できました。また、「Androidはウィンドウを追加できませんが有効ではありません。アクティビティは実行されていますか?」という奇妙な例外も解決します。
Eslam Yousef Mohammed

どうすればgetParent()を使用できますか?
vinidog

ありがとうございました!私の場合はうまくいきました。私は電話をかけてthis.parent.getActivity().getApplicationContext()いましたthis.parent.getActivity()が、トリックをしました。
carlodonz

3

私は推測している-あなたが使用してダイアログを作成しようとしていますか?

 getApplicationContext()
 mContext which is passed by activity.

ダイアログの非アクティビティクラスを表示する場合は、アクティビティをパラメータとして渡す必要があります。

Activity activity=YourActivity.this;

今それは素晴らしい仕事になります。

あなたが何か問題を見つけたら、私に知らせてください。


2

私はこれをコンテキストフィールドで試しました:

this.getActivity().getParent()

そしてそれは私にとってはうまくいきます。これは、「フラグメント」から拡張されたクラスからのものです。

public class filtro extends Fragment{...

2

こんにちはアダプターを使用している場合、チャンスがあるかもしれません。
アダプタ、getContext()、コンテキスト、またはアクティビティでダイアログを使用したときに知っておく必要があるのは、いつか機能しないことです。

これが私が使ったトリック v.getRootView().getContext() で、vは参照しているビューオブジェクトです。
例えば。


            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new DatePickerDialog(v.getRootView().getContext(), date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH)).show();
            }
        });  
If you are getting this problem because of alert dialog.
Refer [here][1] But it is same concept.


  [1]: https://stackoverflow.com/questions/6367771/displaying-alertdialog-inside-a-custom-listadapter-class

ありがとうございました !貴重な時間を節約してくれて!! (^_^)
ニースumang

1

同じ例外が発生しました。これを修正するために行うのは、ダイアログのインスタンスをパラメーターとして関数に渡し、コンテキストのみを渡してgetContext()を使用する代わりにそれを使用することです。この解決策は私の問題を解決します、それが役立つことを願っています


0

以下の2つのケースを使用して、CordovaプラグインでProgress Dialogを開こうとしたときに、この例外が発生しました。

  1. 新しいProgressDialog(this.cordova.getActivity()。getParent());

  2. 新しいProgressDialog(this.cordova.getActivity()。getApplicationContext());

後でこのように変わって、

新しいProgressDialog(this.cordova.getActivity());

私にとってはうまくいきます。


0

これを使用すると、コンテキストは機能しませんでしたが、MyActivityName.thisは機能しました。これがそれを必要とする人を助けることを願っています。


0

私はAndroidManifest.xmlに以下のユーザー権限を追加することでこのエラーを解決しました

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

また、アクティビティ名を使用してアラートダイアログを初期化します。

AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);

詳細については、次のURLにアクセスしてください。==> Androidでアラートダイアログを作成する方法

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.