Android 'Pencere eklenemedi - simge null bir uygulama için değil' istisnası


134

Bir iletişim kutusu açmaya çalıştığımda aşağıdaki Android istisnasını alıyorum. Birisi neler olup bittiğini anlamama yardımcı olabilir mi ve bu sorunu nasıl düzeltebilirim?

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
Kod göndermeden nasıl bilebiliriz?
Falmarri


1
Bu yanıt bakın, bu cevap sonrası linke gereken en önemli şey açıklamak Bu yanıt üzerindeki yorumlarda güzel konuşma vardır neden bu sorun geliyor ve neyi başa iyi yoldur http://stackoverflow.com/a/ 7229248/501483
dharam

Hizmet kullanıyorsanız, stackoverflow.com/questions/23516689/… adresini okuyun .
CoolMind

Yanıtlar:


421

Tahmin ediyorum - bir uygulama bağlamıyla Dialog oluşturmaya mı çalışıyorsunuz? Bunun gibi bir şey:

new Dialog(getApplicationContext());

Bu yanlış. Bir Etkinlik bağlamı kullanmanız gerekir.

Şunu denemek zorundasınız:

new Dialog(YourActivity.this);

1
Teşekkürler. Ancak yeni Dialog (getApplicationContext ()) kullanmadım; Yalnızca 'yeni AlertDialog.Builder (mContext);' burada mContext bir etkinliğe başvuru niteliğindedir.
michael

10
Sonra mContext MyActivity.this olmalıdır.
Luis

10
Özel bir iletişim kutusu oluşturmak için android belgelerinde ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) bu hata var. Context mContext = getApplicationContext (); İletişim kutusu = yeni İletişim Kutusu (mContext); Düzeltmeniz Dialog dialog = new Dialog (this); Hangi işe yarıyor! Teşekkürler
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html düzeltildi (bir süredir). Sadece referans için bunu işaret ediyor. Desen de geliştirildi. :)
Martin Marconcini

2
getActivity()@SagarDevanga
Pratik Butani

34

Kullanmaya devam edebilirsiniz getApplicationContext(), ancak kullanmadan önce şu bayrağı eklemeniz gerekir:, dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)ve hata gösterilmez.

Ve izin eklemeyi unutmayın:

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

Evet, oldukça basit. Ve izin eklemeyi unutmayın, hemen şimdi düzenledim.
codezjx

3
GetActivity () bir RecyclerAdapter içinde kullanılamaz
Martin Erlic

Bu harika :)
Syed Hamza Hassan

Bayrağı nasıl eklersiniz?
Conner Dassen

13

Benim durumumda böyle bir iletişim kutusu oluşturmaya çalışıyordum:

new Dialog(getApplicationContext());

Bu yüzden şunu değiştirmek zorunda kaldım:

new Dialog(this);

Ve benim için iyi çalışıyor;)


1
Yanıtınız doğrudur, ancak yalnızca etkinlik kapsamında olduğunuzda çalışır. Bir iç alanı olan, kullanmak zorunda MyActivity.classyerine this, çünkü thisfarklı bir nesneye işaret eder.
Shahar

1
Ayrıca, temanızı devralmasını thissağlayacaktır Dialog.
TheRealChx101

12

Umarım işe yarayacak, benim için çalıştı gibi bir getParent()argüman yerinde deneyin .contextnew AlertDialog.Builder(getParent());


Neden getParent () kullanıyorsunuz?
José Castro

2
Activity sınıfını genişletmeyen başka bir sınıfta herhangi bir iletişim kutusu gösterdiğinizde, Etkinliği genişleten sınıfın bağlamını alamayabilirsiniz. Bu nedenle, iletişim kutusunu göstermeye çalıştığınız ancak Etkinliği genişletmediğiniz sınıfınızın içindeki bağlamı elde etmek için size bu üstün etkinliğin bağlamını döndüren getParent () yöntemini kullanabilirsiniz.
Priyank Joshi

1
Teşekkürler @PriyankJoshi, sen benim gün kurtardın, aynı zamanda garip istisna çözer "Android pencere eklenemiyor geçerli değil; etkinliğiniz çalışıyor?".
Eslam Yousef Mohammed

GetParent () yöntemini nasıl kullanabilirim?
vinidog

Teşekkür ederim! Benim durumumda çalıştı. Aradım this.parent.getActivity().getApplicationContext()ama this.parent.getActivity()hile yaptı.
carlodonz

3

Tahmin ediyorum - kullanarak Dialog oluşturmaya çalışıyorsunuz.

 getApplicationContext()
 mContext which is passed by activity.

iletişim dışı etkinlik sınıfını görüntülüyorsanız, etkinliği parametre olarak iletmeniz gerekir.

Activity activity=YourActivity.this;

Şimdi harika olacak.

Eğer herhangi bir sorun bulursan bana haber ver.


2

Bunu bağlam alanında denedim:

this.getActivity().getParent()

ve benim için iyi çalışıyor. Bu, "Fragment" dan uzanan bir sınıftan geliyordu:

public class filtro extends Fragment{...

2

Adaptör kullanıyorsanız merhaba orada bir şans olabilir.
Bağdaştırıcı, getContext (), bağlam veya etkinlikte herhangi bir iletişim kutusu kullandığınızda bilmeniz gereken tek şey bir süre çalışmaz.

Burada, v.getRootView().getContext() v'nin başvurduğunuz görünüm nesnesi olduğu yerde kullandığım hile .
Örneğin.


            @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

Teşekkür ederim ! benim değerli zamanımı kurtardı !! (^_^)
Güzel umang

1

Aynı istisnayı yaşadım. bunu düzeltmek için yaptığım şey parametre olarak iletişim kutusu örneğini geçmek ve sadece bağlam yerine getContext () kullanarak yerine kullanmaktır. Bu çözüm sorunumu çözdü, umarım yardımcı olabilir


0

Bu istisnayı yakaladım, aşağıdaki iki durumu kullanarak Cordova Plugin altında İlerleme İletişim Kutusunu açmaya çalıştığımda,

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

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

Daha sonra böyle değişti,

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

Benim için iyi çalışıyor.


0

Bunu kullanın ve benim için çalışmayan bağlamı ... ama MyActivityName.this çalıştı. Umarım buna ihtiyacı olan herkese yardımcı olur.


0

Bu hatayı AndroidManifest.xml'de kullanıcı izni ekleyerek çözdüm

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

Ayrıca, Etkinlik Adıyla Uyarı iletişim kutusunu başlat:

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

Daha Fazla Ayrıntı için ==> Android'de Uyarı İletişim Kutusu nasıl oluşturulur? Sayfasını ziyaret edin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.