ダイアログを開こうとすると、次の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)
私は推測しています-アプリケーションコンテキストでDialogを作成しようとしていますか?このようなもの:
new Dialog(getApplicationContext());
これは間違っています。アクティビティコンテキストを使用する必要があります。
次のように試してください:
new Dialog(YourActivity.this);
引き続きgetApplicationContext()
を使用できますが、使用する前にこのフラグを追加する必要があります:dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
。エラーは表示されません。
そして、許可を追加することを忘れないでください:
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />
getParent()
のようなcontext
の引数の場所でnew AlertDialog.Builder(getParent());
を試してください。
私の場合、次のようなダイアログを作成しようとしていました。
new Dialog(getApplicationContext());
だから私は変更する必要がありました:
new Dialog(this);
そして、それは私のためにうまくいきます;)
私は推測している-あなたはダイアログを使用して作成しようとしている。
getApplicationContext()
mContext which is passed by activity.
ダイアログ非アクティビティクラスを表示する場合、アクティビティをパラメータとして渡す必要があります。
Activity activity=YourActivity.this;
これでうまくいきます。
問題が見つかった場合はお知らせください。
コンテキストフィールドでこれを試しました:
this.getActivity().getParent()
そしてそれは私のためにうまく機能します。これは、「フラグメント」から拡張されるクラスからのものでした。
public class filtro extends Fragment{...
同じ例外が発生しました。これを修正するために行うことは、ダイアログのインスタンスをパラメーターとして関数に渡し、コンテキストのみを渡してからgetContext()を使用する代わりにそれを使用することです。この解決策は私の問題を解決し、それが役立つことを願っています
以下の2つのケースを使用してCordovaプラグインでProgress Dialogを開こうとすると、この例外が発生しました。
new ProgressDialog(this.cordova.getActivity()。getParent());
new ProgressDialog(this.cordova.getActivity()。getApplicationContext());
後にこのように変更され、
新しいProgressDialog(this.cordova.getActivity());
私にとってはうまく機能します。
これとコンテキストを使用してください..しかし、MyActivityName.thisは機能しました。これが必要な人に役立つことを願っています。
アダプターを使用している場合は、チャンスがあるかもしれません。
adapter、getContext()、context、またはactivityでダイアログを使用したときに知っておく必要があるのは、いつか機能しないことです。
以下は、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
AndroidManifest.xmlのユーザー権限を以下に追加して、このエラーを解決しました
<uses-permission Android:name="Android.permission.SYSTEM_ALERT_WINDOW" />
また、アクティビティ名でアラートダイアログを初期化:
AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
詳細については、==> Androidでアラートダイアログを作成する方法 をご覧ください。