Saya tidak bisa memahami mengapa ini terjadi. Kode ini:
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);
bekerja dengan baik. Namun, kode ini:
mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);
melempar pengecualian berikut:
W/WindowManager( 569): Attempted to add window with non-application token WindowToken{438bee58 token=null}. Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049): at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049): at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049): ... 11 more
Ada ide mengapa ini terjadi? Saya memanggil ini dari onCreate
metode.
android
progressdialog
Felix
sumber
sumber
Fragment
, stackoverflow.com/questions/24825114/…Jawaban:
Versi API mana yang Anda gunakan? Jika saya benar tentang masalahnya maka ini telah diperbaiki di Android 1.6 (API versi 4).
Sepertinya referensi objek yang
getApplicationContext()
mengembalikan hanya menunjuk ke nol. Saya pikir Anda mengalami masalah yang mirip dengan yang saya alami di mana beberapa kode dionCreate()
sedang dijalankan sebelum jendela benar-benar selesai dibangun. Ini akan menjadi peretasan, tetapi coba luncurkan Thread baru dalam beberapa ratus milidetik (IIRC: 300-400 tampaknya berfungsi untuk saya, tetapi Anda harus mengotak-atik) yang membuka ProgressDialog Anda dan memulai apa pun yang Anda butuhkan ( mis. jaringan IO). Sesuatu seperti ini:sumber
Saya menggunakan Android versi 2.1 dengan API Level 7. Saya menghadapi masalah ini (atau serupa) dan diselesaikan dengan menggunakan ini:
alih-alih ini:
Semoga ini membantu :)
sumber
Bagi saya bekerja berubah
untuk
Hal yang aneh adalah bahwa yang pertama dapat ditemukan di tutorial google dan orang-orang mendapatkan kesalahan ini ..
sumber
this
semua saja tidak akan berfungsi jika Anda melakukannya di dalam, misalnya, click listener.Saya tidak berpikir ini adalah masalah waktu di sekitar konteks aplikasi null
Coba perluas Aplikasi dalam aplikasi Anda (atau gunakan saja jika Anda sudah memilikinya)
Jadikan instance tersedia sebagai singleton pribadi. Ini tidak pernah nol
Buat pembantu statis di MyApp (yang akan menggunakan singleton)
LEDAKAN!!
Juga, lihat jawaban insinyur android di sini: WindowManager $ BadTokenException
Sekarang, saya setuju, tidak masuk akal bahwa metode ini mengambil parameter Konteks, bukan Aktivitas ..
sumber
Setelah membaca jawaban di atas, saya menemukan bahwa untuk situasi saya, masalah berikut ini diperbaiki.
Ini melemparkan kesalahan
Berdasarkan jawaban sebelumnya yang menyarankan bahwa konteksnya salah, saya mengubah getApplicationContext () untuk mengambil konteks dari Tampilan yang diteruskan ke metode tombol onClick.
Saya tidak sepenuhnya memahami cara kerja Java jadi saya bisa saja salah, tapi saya menduga bahwa untuk situasi spesifik saya penyebabnya bisa jadi terkait dengan fakta bahwa potongan di atas didefinisikan dalam kelas Aktivitas Abstrak; diwariskan dan digunakan oleh banyak Aktivitas, mungkin itu berkontribusi pada fakta bahwa getApplicationContext () tidak mengembalikan konteks yang valid ?? (Hanya tebakan).
sumber
Saya membuat tampilan peta dengan overlay yang diperinci. Saya membuat overlay terperinci seperti ini dari mapActivity saya:
Saya menemukan bahwa saya akan mendapatkan pengecualian "android.view.WindowManager $ BadTokenException: Tidak dapat menambahkan window - token null bukan untuk aplikasi" ketika metode onTap itemizedoverlay saya dipicu (ketika lokasi diketuk pada mapview).
Saya menemukan bahwa jika saya meneruskan, 'this' alih-alih 'getApplicationContext ()' ke konstruktor saya, masalahnya hilang. Ini sepertinya mendukung kesimpulan alienjazzcat. aneh.
sumber
Untuk Aktivitas yang ditampilkan dalam TabActivities gunakan getParent ()
dari pada
sumber
Untuk Android 2.2
Gunakan kode ini:
alih-alih kode ini:
Catatan: Dialog kustom saya dibuat di luar
activity.onCreateDialog(int dialogId)
metode.sumber
Coba -
sumber
Memiliki masalah yang sama dengan (kompatibilitas) Fragmen di mana menggunakan
getActivity()
dalam membuatProgressDialog.show()
crash itu. Saya setuju bahwa itu karena waktu.Perbaikan yang mungkin:
alih-alih menggunakan
Tempatkan mContext sedini mungkin untuk memberinya lebih banyak waktu untuk mengambil konteks. Masih belum ada jaminan bahwa ini akan berhasil, ini hanya mengurangi kemungkinan crash. Jika masih tidak berhasil, Anda harus menggunakan peretasan pengatur waktu (yang dapat menyebabkan masalah waktu lain seperti menutup dialog nanti).
Tentunya kalau bisa pakai
this
orActivityName.this
, lebih stabil karenathis
sudah menunjuk ke sesuatu. Namun dalam beberapa kasus, seperti pada arsitektur Fragmen tertentu, ini bukanlah suatu pilihan.sumber
(Untuk referensi di masa mendatang)
Saya pikir itu karena ada perbedaan Konteks Aplikasi dan Konteks Aktivitas, seperti yang dijelaskan di sini: http://www.doubleencore.com/2013/06/context/
Artinya kita tidak bisa menampilkan dialog menggunakan Application Context. Itu dia.
sumber
Untuk menggunakan dialog di dalam aktivitas, lakukan dengan cara ini:
Untuk menggunakan dialog di dalam fragmen, lakukan dengan cara ini:
Itu dia ^ _ ^
sumber
Apa yang saya lakukan untuk menyiasati ini adalah membuat kelas dasar untuk semua aktivitas saya tempat saya menyimpan data global. Pada aktivitas pertama, saya menyimpan konteks dalam variabel di kelas dasar saya seperti ini:
Kelas Dasar
Aktivitas Pertama berasal dari Kelas Dasar
Kemudian saya menggunakan mycontext daripada getApplicationContext saat membuat dialog.
sumber
Jika Anda memanggil ProgressDialog.show () dalam sebuah fragmen, mentransmisikan mContext ke Activity berhasil untuk saya.
sumber
Ini masalah umum. Gunakan
this
alih-alihgetApplicationContext()
Itu seharusnya menyelesaikan masalah Andasumber
Saya telah mengimplementasikan Dialog Peringatan untuk pengecualian dengan tampilan aktif saat ini. Setiap kali saya memberikan seperti ini
Diberikan Pengecualian Jendela yang sama. Saya menulis kode untuk peringatan dari onCreate (). Begitu sederhana saya gunakan
context = this;
setelahsetContentView()
pernyataan dalamonCreate()
metode. Mengambil variabel konteks sebagai global likeContext context;
Contoh kode adalah
Contoh Metode Peringatan adalah
Ini berfungsi dengan baik untuk saya Sebenarnya saya mencari kesalahan ini di StackOverflow saya menemukan kueri ini.Setelah membaca semua tanggapan dari posting ini, saya mencoba cara ini agar berhasil.Saya pikir ini adalah solusi sederhana untuk mengatasi pengecualian.
Terima kasih, Rajendar
sumber
jika Anda memiliki masalah pada groupActivity jangan gunakan ini. PARENT adalah statis dari Parent ActivityGroup.
dari pada
sumber
Dialog selalu dibuat dan ditampilkan sebagai bagian dari suatu Aktivitas. Anda harus meneruskan dalam konteks Aktivitas alih-alih konteks Aplikasi.
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
sumber