Android "Невозможно добавить оконный токен null не для исключения приложения"
При попытке открыть диалоговое окно появляется следующее исключение 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)
Ответы
Ответ 1
Я предполагаю, вы пытаетесь создать диалог с контекстом приложения? Что-то вроде этого:
new Dialog(getApplicationContext());
Это неправильно. Вам нужно использовать контекст Activity.
Вам нужно попробовать:
new Dialog(YourActivity.this);
Ответ 2
Вы можете продолжать использовать getApplicationContext()
, но перед использованием вы должны добавить этот флаг: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)
, и ошибка не будет отображаться.
И не забудьте добавить разрешение:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Ответ 3
Попробуйте getParent()
в месте аргумента context
как new AlertDialog.Builder(getParent());
Надеюсь, что это сработает, это сработало для меня.
Ответ 4
В моем случае я пытался создать свой диалог следующим образом:
new Dialog(getApplicationContext());
Поэтому мне пришлось изменить для:
new Dialog(this);
И это отлично работает для меня;)
Ответ 5
Я предполагаю, вы пытаетесь создать диалог с помощью.
getApplicationContext()
mContext which is passed by activity.
Если вы выведете диалоговый класс non activity, тогда вам необходимо передать активность в качестве параметра.
Activity activity=YourActivity.this;
Теперь это будет отлично работать.
Если вы обнаружили какие-либо проблемы, сообщите мне.
Ответ 6
Я попытался с этим в поле контекста:
this.getActivity().getParent()
и он отлично работает для меня. Это было из класса, который простирается от "Фрагмента":
public class filtro extends Fragment{...
Ответ 7
Я получил то же исключение. что я делаю, чтобы это исправить - передать экземпляр диалога в качестве параметра в функцию и использовать его вместо передачи только контекста, а затем с помощью getContext(). это решение решит мою проблему, надеюсь, оно поможет
Ответ 8
У меня есть это исключение, когда я попытался открыть Progress Dialog под Кордовым плагином, используя ниже двух случаев,
Позже это изменилось,
новый ProgressDialog (this.cordova.getActivity());
Его работа прекрасна для меня.
Ответ 9
Используйте это и контекст не работал для меня.. но MyActivityName.this работал. Надеюсь, это поможет всем, кто в этом нуждается.
Ответ 10
Я решил эту ошибку, добавив ниже разрешение пользователя в AndroidManifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Кроме того, диалоговое окно "Инициализация оповещения" с именем действия
AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
Для получения более подробной информации, посетите ==> Как создать Alert Dialog в Android
Ответ 11
Здравствуйте, если вы используете адаптер, может быть шанс.
Все, что вам нужно знать, когда вы используете какой-либо диалог в адаптере, 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/info/6367771/displaying-alertdialog-inside-a-custom-listadapter-class