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)
michael
sumber
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);
Peter Knego
sumber
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" />
codezjx
sumber
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;)

postNuKe
sumber
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.

Priyank Joshi
sumber
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.

Harshid
sumber
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{...
Matias
sumber
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
kontashi35
sumber
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

Anonim-E
sumber
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.

kedelai
sumber
0

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

Makvin
sumber
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

Ganesh Garad
sumber