PopupWindow $ BadTokenException: Невозможно добавить null-token null недействительно

При отображении PopupWindow появляется следующая ошибка. Ошибки запускаются по строке:

checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0); 

mapView – это MapView, и ничего нет. Стек:

 01-08 18:00:09.402: E/AndroidRuntime(27768): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.ViewRootImpl.setView(ViewRootImpl.java:513) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.view.Window$LocalWindowManager.addView(Window.java:537) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.widget.PopupWindow.invokePopup(PopupWindow.java:988) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:845) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.widget.PopupWindow.showAtLocation(PopupWindow.java:809) 01-08 18:00:09.402: E/AndroidRuntime(27768): at com.geoloc.ActivityCheckIn.onCreate(ActivityCheckIn.java:50) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.app.Activity.performCreate(Activity.java:4465) 01-08 18:00:09.402: E/AndroidRuntime(27768): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 

Это код моей активности (который расширяет MapActivity)

  protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.checkin); mapView = (MapView) findViewById(R.id.mapview); LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); checkInPopup = new PopupWindow(inflater.inflate(CHECK_IN_POPUP_LAYOUT, null, false)); checkInPopup.setOutsideTouchable(true); checkInPopup.setHeight(100); checkInPopup.setWidth(200); checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0); } 

Спасибо, что поделились своими мыслями

вы показываете свое всплывающее окно слишком рано. Вы можете опубликовать задержанную runnable для showatlocation в Onresume, Попробуйте

Редактировать: на этот пост, похоже, была поставлена одна и та же проблема. Проблемы с созданием всплывающего windows в Android-активности

Такая же проблема произошла со мной, когда я пытаюсь показать всплывающее меню в действии, я тоже получил такое же действие, но я столкнулся с проблемой n, разрешив контекст

YourActivityName.this вместо getApplicationContext() в

Dialog dialog = new Dialog(getApplicationContext());

и да, это сработало для меня, это может помочь кому-то еще

Есть два сценария, когда это исключение может произойти. Один упоминается нэндишем. Другой сценарий упоминается здесь: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

Убедитесь, что вы справляетесь с обоими из них

Родитель всплывающего windows не может быть всплывающим. Оба их родителя должны быть одинаковыми. Таким образом, если вы создаете всплывающее окно внутри всплывающего windows, вы должны сохранить всплывающее окно родителя и сделать его родительским.

вот пример

  @Override protected void onCreate(Bundle savedInstanceState) { View view = LayoutInflater.from(mContext).inflate(R.layout.popup_window_layout, new LinearLayout(mContext), true); popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setContentView(view); } @Override public void onWindowFocusChanged(boolean hasFocus) { if (hasFocus) { popupWindow.showAtLocation(parentView, Gravity.BOTTOM, 0, 0); } } 

правильным способом является popupwindow.show () в onWindowFocusChanged ().

Попробуйте показать поп, как показано ниже.

 findViewById(R.id.main_layout).post(new Runnable() { public void run() { mPopupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.CENTER, 0, 0); Button close = (Button) customView.findViewById(R.id.btn_ok); close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mPopupWindow.dismiss(); doOtherStuff(); } }); } }); 

Попытайтесь использовать его

 LayoutInflater inflater = (LayoutInflater).getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflate.from(YourActivity.this).inflate(R.layout.yourLayout, null); 
  • Узнайте, прокручивается ли ListView до конца?
  • Волейбол не вызывает getParams () для стандартного запроса POST
  • Преобразование дат UTC в другие часовые пояса
  • Можно ли добавить массив или объект в SharedPreferences на Android?
  • Ошибка Eclipse DDMS «Невозможно связать с локальным 8600 для отладчика»
  • Не удалось решить: com.android.support:cardview-v7:26.0.0 android
  • Ошибка Listview: «В вашем контенте должен быть ListView с атрибутом id« android.R.id.list »
  • Как обрабатывать код, когда приложение убито путем прокрутки в Android?
  • Как удалить фокус, не устанавливая фокус на другой элемент управления?
  • Android onViewClickListener не работает
  • Постоянно скрывать строку состояния Android
  • Давайте будем гением компьютера.