Android 'Không thể thêm cửa sổ - mã thông báo null không dành cho ngoại lệ của ứng dụng


134

Tôi nhận được ngoại lệ Android sau đây khi tôi cố gắng mở hộp thoại. Ai đó có thể vui lòng giúp tôi hiểu những gì đang xảy ra và làm thế nào tôi có thể khắc phục vấn đề này?

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
Làm thế nào chúng ta phải biết mà không đăng một số mã?
Falmarri


1
Vui lòng tham khảo câu trả lời này, điều chính để đăng liên kết của câu trả lời này là có một cuộc trò chuyện thú vị trong các bình luận về câu trả lời này mô tả lý do tại sao vấn đề này xảy ra và cách tốt nhất để giải quyết nó http://stackoverflow.com/a/ 7229248/501483
dharam

Nếu bạn sử dụng Dịch vụ, hãy đọc stackoverflow.com/questions/23516689/ .
CoolMind

Câu trả lời:


421

Tôi đoán - bạn đang cố gắng tạo Hộp thoại với ngữ cảnh ứng dụng phải không? Một cái gì đó như thế này:

new Dialog(getApplicationContext());

Cái này sai. Bạn cần sử dụng bối cảnh Activity.

Bạn phải thử như:

new Dialog(YourActivity.this);

1
Cảm ơn. Nhưng tôi đã không sử dụng Hộp thoại mới (getApplicationContext ()); Tôi chỉ sử dụng 'AlertDialog.Builder mới (mContext);' trong đó mContext là một tham chiếu đến một hoạt động.
michael

10
Sau đó, mContext sẽ là MyActivity.this.
Luis

10
Các tài liệu android ( developer.android.com/guide/topics/ui/dialogs.html#CustomDialog ) để tạo hộp thoại tùy chỉnh có lỗi này. Bối cảnh mContext = getApplicationContext (); Hộp thoại Hộp thoại = Hộp thoại mới (mContext); Khắc phục của bạn dẫn đến hộp thoại Hộp thoại = Hộp thoại mới (cái này); Mà hoạt động! Cảm ơn
bnieland

1
developer.android.com/guide/topics/ui/dialogs.html đã được sửa (sau một thời gian). Chỉ cần chỉ ra điều này để tham khảo. Các mô hình đã được cải thiện là tốt. :)
Martin Marconcini

2
Sử dụng getActivity()@SagarDevanga
Pratik Butani

34

Bạn có thể tiếp tục sử dụng getApplicationContext(), nhưng trước khi sử dụng, bạn nên thêm cờ này:dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) , và lỗi sẽ không hiển thị.

Và đừng quên thêm quyền:

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

Vâng, nó khá đơn giản. Và đừng quên thêm quyền, tôi vừa chỉnh sửa.
codezjx

3
Không thể sử dụng getActivity () trong RecyclerAd
CHƯƠNG

Điều đó thật tuyệt vời :)
Syed Hamza Hassan

Làm thế nào để bạn thêm cờ?
Conner Dassen

13

Trong trường hợp của tôi, tôi đã cố gắng tạo hộp thoại của mình như thế này:

new Dialog(getApplicationContext());

Vì vậy, tôi đã phải thay đổi cho:

new Dialog(this);

Và nó hoạt động tốt với tôi;)


1
Câu trả lời của bạn là chính xác, tuy nhiên nó sẽ chỉ hoạt động khi bạn ở trong phạm vi hoạt động. Nếu bạn ở trong một phạm vi bên trong, bạn phải sử dụng MyActivity.classthay thisvì vì thisđề cập đến một đối tượng khác.
Shahar

1
Ngoài ra, thissẽ đảm bảo Dialogkế thừa chủ đề của bạn.
TheRealChx101

12

Hãy thử getParent()tại nơi tranh luận contextnhư new AlertDialog.Builder(getParent());Hy vọng nó sẽ hoạt động, nó làm việc cho tôi.


Tại sao sử dụng getParent ()?, Có nghĩa là gì?
Jose Castro

2
Khi bạn đang hiển thị bất kỳ hộp thoại nào trong một lớp khác không mở rộng lớp Activity, do đó bạn có thể không nhận được ngữ cảnh của lớp đó đang mở rộng Activity. Vì vậy, để có được bối cảnh bên trong lớp của bạn, nơi bạn đang cố gắng hiển thị hộp thoại nhưng không mở rộng Hoạt động, bạn có thể sử dụng getParent () trả về cho bạn bối cảnh của hoạt động ưu việt đó.
Priyank Joshi

1
Cảm ơn @PriyankJoshi, bạn đã lưu lại ngày của tôi, nó cũng giải quyết được ngoại lệ kỳ lạ của "Android Không thể thêm cửa sổ không hợp lệ; hoạt động của bạn có chạy không?".
Eslam Yousef Mohammed

Làm thế nào tôi có thể sử dụng getParent ()?
vinidog

Cảm ơn bạn! Nó đã làm việc trong trường hợp của tôi. Tôi đã gọi this.parent.getActivity().getApplicationContext()nhưng this.parent.getActivity()đã lừa
carlodonz

3

Tôi đoán - bạn đang cố gắng tạo Hộp thoại bằng cách sử dụng.

 getApplicationContext()
 mContext which is passed by activity.

nếu Bạn hiển thị hộp thoại không hoạt động lớp thì bạn phải truyền hoạt động như một tham số.

Activity activity=YourActivity.this;

Bây giờ nó sẽ làm việc tuyệt vời.

Nếu bạn tìm thấy bất kỳ rắc rối thì cho tôi biết.


2

Tôi đã thử với điều này trong trường ngữ cảnh:

this.getActivity().getParent()

và nó hoạt động tốt cho tôi. Đây là từ một lớp học kéo dài từ "Mảnh vỡ":

public class filtro extends Fragment{...

2

Xin chào nếu bạn đang sử dụng bộ chuyển đổi có thể có cơ hội.
Tất cả những gì bạn cần biết khi bạn sử dụng bất kỳ hộp thoại nào trong bộ điều hợp, getContext (), ngữ cảnh hoặc hoạt động đôi khi sẽ không hoạt động.

Đây là mẹo tôi đã sử dụng v.getRootView().getContext() trong đó v là đối tượng xem bạn đang tham chiếu.
Ví dụ.


            @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

Cảm ơn bạn ! vì đã tiết kiệm thời gian quý báu của tôi !! (
^ _ ^)

1

Tôi đã có ngoại lệ tương tự. Những gì tôi làm để khắc phục điều này là chuyển thể hiện của hộp thoại thành tham số vào hàm và sử dụng nó thay vì chỉ truyền ngữ cảnh sau đó sử dụng getContext (). Giải pháp này giải quyết vấn đề của tôi, hy vọng nó có thể giúp


0

Tôi đã có ngoại lệ này, khi tôi cố mở Hộp thoại Tiến trình trong Plugin Cordova bằng cách sử dụng hai trường hợp dưới đây,

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

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

Sau này thay đổi như thế này,

ProgressDialog mới (this.cordova.getActivity ());

Nó làm việc tốt cho tôi.


0

Sử dụng điều này và bối cảnh không hoạt động cho tôi..nhưng MyActivityName.this đã làm việc. Hy vọng điều này sẽ giúp bất cứ ai cần nó.


0

Tôi đã khắc phục lỗi này bằng cách thêm quyền dưới đây cho phép người dùng trong AndroidManifest.xml

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

Ngoài ra, khởi tạo hộp thoại Thông báo với Tên hoạt động:

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

Để biết thêm chi tiết, hãy truy cập ==> Cách tạo hộp thoại cảnh báo trong Android

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.