Android 'ไม่สามารถเพิ่มหน้าต่าง - โทเค็น null ไม่ได้เป็นข้อยกเว้นสำหรับแอปพลิเคชัน'


134

ฉันได้รับข้อยกเว้นของ Android ดังต่อไปนี้เมื่อฉันพยายามเปิดกล่องโต้ตอบ ใครช่วยช่วยฉันเข้าใจว่าเกิดอะไรขึ้นและฉันจะแก้ไขปัญหานี้ได้อย่างไร

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
เราจะรู้ได้อย่างไรโดยไม่ต้องโพสต์โค้ด
Falmarri


1
โปรดอ้างอิงคำตอบนี้สิ่งสำคัญในการโพสต์ลิงก์ของคำตอบนี้คือมีการสนทนาที่ดีในความคิดเห็นเกี่ยวกับคำตอบนี้ซึ่งอธิบายว่าเหตุใดปัญหานี้จึงเกิดขึ้นและวิธีที่ดีที่สุดในการจัดการกับปัญหานี้คืออะไรhttp://stackoverflow.com/a/ 7229248/501483
dharam

หากคุณใช้บริการอ่านstackoverflow.com/questions/23516689/...
CoolMind

คำตอบ:


421

ฉันเดาว่า - คุณกำลังพยายามสร้าง Dialog ด้วยบริบทของแอปพลิเคชันหรือไม่? สิ่งนี้:

new Dialog(getApplicationContext());

นี่เป็นสิ่งที่ไม่ถูกต้อง คุณต้องใช้บริบทกิจกรรม

คุณต้องลองเช่น:

new Dialog(YourActivity.this);

1
ขอบคุณ. แต่ฉันไม่ได้ใช้ Dialog ใหม่ (getApplicationContext ()); ฉันใช้ 'AlertDialog.Builder (mContext) ใหม่เท่านั้น' โดยที่ mContext อ้างอิงถึงกิจกรรม
michael

10
จากนั้น mContext ควรเป็น MyActivity.this
ลุย

10
เอกสาร Android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) สำหรับการสร้างกล่องโต้ตอบที่กำหนดเองมีข้อผิดพลาดนี้ บริบท mContext = getApplicationContext (); ไดอะล็อกโต้ตอบ = ไดอะล็อกใหม่ (mContext); การแก้ไขของคุณนำไปสู่ ​​Dialog dialog = new Dialog (this); ซึ่งได้ผล! ขอบคุณ
bnieland

1
developer.android.com/guide/topics/ui/dialogs.htmlได้รับการแก้ไขแล้ว (ตั้งแต่ระยะหนึ่ง) เพียงแค่ชี้สิ่งนี้เพื่อการอ้างอิง รูปแบบได้รับการปรับปรุงเช่นกัน :)
Martin Marconcini

2
ใช้getActivity()@SagarDevanga
Pratik Butani

34

คุณสามารถใช้ต่อไปได้getApplicationContext()แต่ก่อนใช้คุณควรเพิ่มแฟล็กนี้: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)และข้อผิดพลาดจะไม่แสดง

และอย่าลืมเพิ่มสิทธิ์:

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

ใช่มันค่อนข้างง่าย และอย่าลืมเพิ่มสิทธิ์ฉันแก้ไขเมื่อครู่นี้
codezjx

3
ไม่สามารถใช้ getActivity () ใน RecyclerAdapter
Martin Erlic

มันยอดเยี่ยมมาก :)
Syed Hamza Hassan

คุณจะเพิ่มธงได้อย่างไร?
Conner Dassen

13

ในกรณีของฉันฉันพยายามสร้างกล่องโต้ตอบของฉันดังนี้:

new Dialog(getApplicationContext());

ดังนั้นฉันต้องเปลี่ยนสำหรับ:

new Dialog(this);

และมันก็ใช้ได้ดีสำหรับฉัน;)


1
คำตอบของคุณถูกต้องอย่างไรก็ตามจะใช้ได้เฉพาะเมื่อคุณอยู่ในขอบเขตกิจกรรมเท่านั้น หากคุณอยู่ในขอบเขตภายในคุณต้องใช้MyActivity.classแทนthisเพราะthisอ้างถึงวัตถุอื่น
Shahar

1
นอกจากนี้thisจะตรวจสอบให้แน่ใจว่าคุณDialogสืบทอดธีมของคุณ
TheRealChx101

12

ลองใช้getParent()สถานที่โต้แย้งcontextเช่นnew AlertDialog.Builder(getParent());หวังว่ามันจะได้ผลมันได้ผลสำหรับฉัน


ทำไมต้องใช้ getParent () หมายความว่าอย่างไร
José Castro

2
เมื่อคุณแสดงกล่องโต้ตอบใด ๆ ในชั้นเรียนอื่นที่ไม่ได้ขยายชั้นเรียนกิจกรรมดังนั้นคุณอาจไม่ได้รับบริบทของชั้นเรียนนั้นที่ขยายกิจกรรม ดังนั้นเพื่อให้ได้บริบทภายในชั้นเรียนของคุณที่คุณพยายามแสดงกล่องโต้ตอบ แต่ไม่ขยายกิจกรรมคุณสามารถใช้ getParent () ซึ่งส่งคืนบริบทของกิจกรรมที่เหนือกว่านั้นให้คุณ
Priyank Joshi

1
ขอบคุณ @PriyankJoshi คุณช่วยวันของฉันไว้มันยังแก้ข้อยกเว้นแปลก ๆ ของ "Android ไม่สามารถเพิ่มหน้าต่างไม่ถูกต้องกิจกรรมของคุณกำลังทำงานอยู่หรือไม่"
Eslam Yousef Mohammed

ฉันจะใช้ getParent () ได้อย่างไร?
vinidog

ขอบคุณ! มันใช้ได้ในกรณีของฉัน ฉันโทรหาthis.parent.getActivity().getApplicationContext()แต่this.parent.getActivity()ทำตามเคล็ดลับ
carlodonz

3

ฉันเดาว่าคุณกำลังพยายามสร้าง Dialog โดยใช้

 getApplicationContext()
 mContext which is passed by activity.

หากคุณแสดงไดอะล็อกที่ไม่ใช่คลาสกิจกรรมคุณจะต้องส่งผ่านกิจกรรมเป็นพารามิเตอร์

Activity activity=YourActivity.this;

ตอนนี้มันจะทำงานได้ดี

หากคุณพบปัญหาใด ๆ โปรดแจ้งให้เราทราบ


2

ฉันลองใช้สิ่งนี้ในฟิลด์บริบท:

this.getActivity().getParent()

และมันก็ใช้ได้ดีสำหรับฉัน นี่มาจากคลาสที่ขยายมาจาก "Fragment":

public class filtro extends Fragment{...

2

สวัสดีถ้าคุณใช้อะแดปเตอร์อาจมีโอกาส
สิ่งที่คุณต้องรู้เมื่อคุณใช้ไดอะล็อกใด ๆ ในอะแดปเตอร์ getContext () บริบทหรือกิจกรรมจะไม่ทำงานในบางครั้ง

นี่คือเคล็ดลับที่ฉันใช้ v.getRootView().getContext() โดยที่ v คือออบเจ็กต์มุมมองที่คุณอ้างอิง
เช่น.


            @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

ขอบคุณ ! เพื่อประหยัดเวลาอันมีค่าของฉัน !! (^_^)
Nice umang

1

ฉันได้รับข้อยกเว้นเดียวกัน สิ่งที่ฉันทำเพื่อแก้ไขปัญหานี้คือการส่งอินสแตนซ์ของไดอะล็อกเป็นพารามิเตอร์ไปยังฟังก์ชันและใช้แทนการส่งผ่านบริบทเท่านั้นจากนั้นใช้ getContext () วิธีนี้ช่วยแก้ปัญหาของฉันหวังว่าจะช่วยได้


0

ฉันได้รับข้อยกเว้นนี้เมื่อฉันพยายามเปิด Progress Dialog ภายใต้ Cordova Plugin โดยใช้สองกรณีด้านล่าง

  1. ProgressDialog ใหม่ (this.cordova.getActivity (). getParent ());

  2. ProgressDialog ใหม่ (this.cordova.getActivity (). getApplicationContext ());

ต่อมาเปลี่ยนไปเช่นนี้

ProgressDialog ใหม่ (this.cordova.getActivity ());

มันทำงานได้ดีสำหรับฉัน


0

ใช้สิ่งนี้และบริบทไม่ได้ผลสำหรับฉัน แต่ MyActivityName นี้ได้ผล หวังว่านี่จะช่วยทุกคนที่ต้องการ


0

ฉันแก้ไขข้อผิดพลาดนี้โดยเพิ่มสิทธิ์ผู้ใช้ด้านล่างใน AndroidManifest.xml

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

นอกจากนี้เริ่มต้นกล่องโต้ตอบการแจ้งเตือนด้วยชื่อกิจกรรม:

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

สำหรับรายละเอียดเพิ่มเติมโปรดไปที่ ==> วิธีสร้างกล่องโต้ตอบการแจ้งเตือนใน Android

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.