Android 'Tidak dapat menambahkan jendela - token null bukan untuk pengecualian aplikasi'


134

Saya mendapatkan pengecualian Android berikut saat mencoba membuka dialog. Adakah yang bisa membantu saya memahami apa yang sedang terjadi dan bagaimana saya bisa memperbaiki masalah ini?

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
Bagaimana kita bisa tahu tanpa memposting beberapa kode?
Falmarri


1
Silakan merujuk jawaban ini, hal utama untuk memposting tautan jawaban ini adalah ada percakapan yang bagus di komentar atas jawaban ini yang menjelaskan mengapa masalah ini datang dan apa cara terbaik untuk mengatasinya http://stackoverflow.com/a/ 7229248/501483
dharam

Jika Anda menggunakan Layanan, baca stackoverflow.com/questions/23516689/… .
CoolMind

Jawaban:


421

Saya menebak - apakah Anda mencoba membuat Dialog dengan konteks aplikasi? Sesuatu seperti ini:

new Dialog(getApplicationContext());

Ini salah. Anda perlu menggunakan konteks Aktivitas.

Anda harus mencoba seperti:

new Dialog(YourActivity.this);

1
Terima kasih. Tapi saya tidak menggunakan Dialog baru (getApplicationContext ()); Saya hanya menggunakan 'new AlertDialog.Builder (mContext);' di mana mContext adalah referensi ke suatu aktivitas.
michael

10
Maka mContext harus MyActivity.this.
Luis

10
Dokumen android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) untuk membuat dialog kustom mengalami error ini. Konteks mContext = getApplicationContext (); Dialog dialog = new Dialog (mContext); Perbaikan Anda mengarah ke Dialog dialog = new Dialog (this); Yang berhasil! Terima kasih
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html telah diperbaiki (sejak beberapa saat). Hanya menunjukkan ini sebagai referensi. Polanya juga telah diperbaiki. :)
Martin Marconcini

2
Gunakan getActivity()@SagarDevanga
Pratik Butani

34

Anda dapat terus menggunakan getApplicationContext(), tetapi sebelum digunakan, Anda harus menambahkan tanda ini:, dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)dan kesalahan tidak akan ditampilkan.

Dan jangan lupa untuk menambahkan izin:

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

Ya, itu cukup sederhana. Dan jangan lupa tambahkan izin, saya edit sekarang.
codezjx

3
Tidak dapat menggunakan getActivity () di RecyclerAdapter
Martin Erlic

Itu luar biasa :)
Syed Hamza Hassan

Bagaimana Anda menambahkan bendera?
Conner Dassen

13

Dalam kasus saya, saya mencoba membuat dialog saya seperti ini:

new Dialog(getApplicationContext());

Jadi saya harus mengganti untuk:

new Dialog(this);

Dan itu berfungsi dengan baik untuk saya;)


1
Jawaban Anda benar, namun hanya akan berfungsi jika Anda berada dalam lingkup aktivitas. Jika Anda berada di lingkup batin, Anda harus menggunakan MyActivity.classbukan thiskarena thismengacu pada objek yang berbeda.
Shahar

1
Juga, thisakan memastikan Anda Dialogmewarisi tema Anda.
TheRealChx101

12

Cobalah getParent()di tempat argumen contextseperti new AlertDialog.Builder(getParent());Berharap itu akan berhasil, itu berhasil untuk saya.


Mengapa menggunakan getParent () ?, apa artinya?
José Castro

2
Saat Anda menampilkan dialog apa pun di kelas lain yang tidak memperluas kelas Aktivitas sehingga Anda mungkin tidak mendapatkan konteks kelas yang memperluas Aktivitas. Jadi untuk mendapatkan konteks di dalam kelas tempat Anda mencoba menampilkan dialog tetapi tidak memperluas Aktivitas, Anda bisa menggunakan getParent () yang mengembalikan Anda konteks aktivitas superior tersebut.
Priyank Joshi

1
Terima kasih @PriyankJoshi, Anda menyelamatkan hari saya, itu juga memecahkan pengecualian aneh "Android Tidak dapat menambahkan jendela tidak valid; apakah aktivitas Anda berjalan?".
Eslam Yousef Mohammed

Bagaimana saya bisa menggunakan getParent ()?
vinidog

Terima kasih! Ini berhasil dalam kasus saya. Saya menelepon this.parent.getActivity().getApplicationContext()tetapi this.parent.getActivity()berhasil.
carlodonz

3

Saya menebak - apakah Anda mencoba membuat Dialog menggunakan.

 getApplicationContext()
 mContext which is passed by activity.

Jika Anda menampilkan dialog kelas non aktivitas maka Anda harus meneruskan aktivitas sebagai parameter.

Activity activity=YourActivity.this;

Sekarang akan bekerja dengan baik.

Jika Anda menemukan masalah, beri tahu saya.


2

Saya mencoba dengan ini di bidang konteks:

this.getActivity().getParent()

dan itu bekerja dengan baik untuk saya. Ini dari kelas yang diturunkan dari "Fragmen":

public class filtro extends Fragment{...

2

Halo jika Anda menggunakan adaptor mungkin ada kesempatan.
Semua yang perlu Anda ketahui saat Anda menggunakan dialog apa pun di adaptor, getContext (), konteks, atau aktivitas suatu saat tidak akan berfungsi.

Berikut adalah trik yang saya gunakan di v.getRootView().getContext() mana v adalah objek tampilan yang Anda referensikan.
Misalnya.


            @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

Terima kasih ! untuk menghemat waktu berharga saya !! (^_^)
Umang yang bagus

1

Saya mendapat pengecualian yang sama. apa yang saya lakukan untuk memperbaikinya adalah dengan melewatkan contoh dari dialog sebagai parameter ke dalam fungsi dan menggunakannya sebagai ganti hanya memberikan konteks kemudian menggunakan getContext (). solusi ini memecahkan masalah saya, semoga dapat membantu


0

Saya mendapat pengecualian ini, ketika saya mencoba membuka Progress Dialog di bawah Plugin Cordova dengan menggunakan dua kasus di bawah ini,

  1. ProgressDialog baru (this.cordova.getActivity (). getParent ());

  2. ProgressDialog baru (this.cordova.getActivity (). getApplicationContext ());

Nanti berubah seperti ini,

ProgressDialog baru (this.cordova.getActivity ());

Ini bekerja dengan baik untuk saya.


0

Gunakan ini dan konteks tidak berhasil untuk saya..tapi MyActivityName.ini berhasil. Semoga ini bisa membantu siapa saja yang membutuhkannya.


0

Saya memecahkan kesalahan ini dengan menambahkan di bawah izin pengguna di AndroidManifest.xml

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

Juga, Inisialisasi dialog Peringatan dengan Nama Aktivitas:

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

Untuk Lebih Jelasnya, kunjungi ==> Cara membuat Dialog Alert di Android

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.