Saya mencoba untuk membuka jendela dialog, tetapi setiap kali saya mencoba membukanya, ia melempar pengecualian ini:
Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
at android.view.ViewRoot.setView(ViewRoot.java:460)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.app.Dialog.show(Dialog.java:238)
at android.app.Activity.showDialog(Activity.java:2413)
Saya membuatnya dengan menelepon showDialog
dengan id tampilan. The onCreateDialog
handler log baik dan saya dapat melangkah melalui itu tanpa masalah, tapi aku sudah melekat sejak sepertinya aku kehilangan sesuatu:
@Override
public Dialog onCreateDialog(int id)
{
Dialog dialog;
Context appContext = this.getApplicationContext();
switch(id)
{
case RENAME_DIALOG_ID:
Log.i("Edit", "Creating rename dialog...");
dialog = new Dialog(appContext);
dialog.setContentView(R.layout.rename);
dialog.setTitle("Rename " + noteName);
break;
default:
dialog = null;
break;
}
return dialog;
}
Apakah ada sesuatu yang hilang dari ini? Beberapa pertanyaan telah berbicara tentang masalah ini saat membuat dialog dari onCreate
, yang terjadi karena aktivitas belum dibuat, tetapi ini berasal dari panggilan dari objek menu, dan appContext
variabel sepertinya diisi dengan benar di debugger.
Anda tidak dapat menampilkan jendela aplikasi / dialog melalui Konteks yang bukan merupakan Kegiatan. Coba lewati referensi aktivitas yang valid
sumber
activity.this
danactivity.getBaseContext()
tetapi tidak berhasil. Ada bantuan?.this
.Ditto pada hal getApplicationContext.
Dokumen-dokumen di situs android mengatakan untuk menggunakannya, tetapi tidak berfungsi ... grrrrr :-P
Kerjakan saja:
"Ini" biasanya adalah Aktivitas Anda dari mana Anda memulai dialog.
sumber
Dokumen Android menyarankan untuk menggunakan getApplicationContext ();
tetapi itu tidak akan berfungsi sebagai gantinya yang menggunakan aktivitas Anda saat ini saat instantiating AlertDialog.Builder atau AlertDialog atau Dialog ...
Ex:
atau
sumber
Alih-alih
getApplicationContext()
, gunakan sajaActivityName.this
sumber
Saya memiliki masalah serupa di mana saya memiliki kelas lain seperti ini:
Bekerja dengan baik sebagian besar waktu, tetapi kadang-kadang jatuh dengan kesalahan yang sama. Kemudian saya menyadari bahwa di
MyActivity
...Karena saya memegang objek sebagai
static
, menjalankan kedua kode masih memegang versi asli objek, dan dengan demikian masih mengacu pada yang asliActivity
, yang tidak ada lama.Kesalahan bodoh konyol, terutama karena saya benar-benar tidak perlu memegang objek seperti
static
di tempat pertama ...sumber
Ubah saja menjadi
Dari pada
sumber
Solusi lain adalah dengan mengatur jenis jendela ke dialog sistem:
Ini membutuhkan
SYSTEM_ALERT_WINDOW
izin:Seperti yang dikatakan para dokter:
Ini adalah solusi yang hanya boleh Anda gunakan jika Anda membutuhkan dialog yang tidak dilampirkan pada suatu aktivitas.
sumber
Jangan gunakan
getApplicationContext()
saat mendeklarasikan dialogSelalu gunakan
this
atau milik Andaactivity.this
sumber
Untuk dialog bersarang masalah ini sangat umum, Ini berfungsi saat
digunakan sebagai ganti
alternatif ini.
sumber
Ini Berhasil untuk saya--
Menggunakan
sumber
Anda juga bisa melakukan ini
Ini berhasil bagi saya !!
sumber
Seperti yang dikatakan, Anda memerlukan suatu Aktivitas sebagai konteks untuk dialog, gunakan "YourActivity.this" untuk konteks statis atau periksa di sini untuk bagaimana menggunakan yang dinamis dalam mode aman
sumber
Cobalah untuk mengatur ulang
dialog
jenis jendela keJangan lupa untuk menggunakan izin
android.permission.SYSTEM_ALERT_WINDOW
sumber
Teks di sini: -
gunakan ini untuk mendapatkan
activity
konteksprogressdialog
atau
progressdialog = new ProgressDialog(this);
gunakan ini untuk mendapatkan konteks aplikasi
BroadcastListener
bukan untukprogressdialog
.sumber
Cara terbaik dan teraman untuk menunjukkan 'ProgressDialog' di AsyncTask, menghindari masalah kebocoran memori adalah dengan menggunakan 'Handler' dengan Looper.main ().
lalu di 'onCreate'
Sekarang Anda selesai dengan bagian setup. Sekarang panggil 'showProgress ()' dan 'hideProgress ()' di AsyncTask.
sumber