PopupWindow $BadTokenException: не удается добавить окно - маркер null не является допустимым
у меня есть следующая ошибка при отображении всплывающего окна. Ошибки вызываются строкой:
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);
}
Спасибо, что поделились своими мыслями
8 ответов:
вы показываете свое всплывающее окно слишком рано. Вы можете опубликовать отложенный запуск для showatlocation в Onresume, попробуйте
Edit: На этот пост, похоже, ответили на ту же проблему проблемы с созданием всплывающего окна в Android Activity
та же проблема произошла со мной, когда я пытаюсь показать всплывающее меню в activity я также получил тот же excpetion но я сталкиваюсь с проблемой N решить, предоставляя контекст
YourActivityName.this
вместоgetApplicationContext()
at
Dialog dialog = new Dialog(getApplicationContext());
и да, это работает для меня, может это поможет кому-то еще
есть два сценария, когда это исключение может произойти. Один из них упоминается нандишем. Другой сценарий упоминается здесь: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/
убедитесь, что вы справляетесь с ними обоими
родитель всплывающего окна не может сам быть всплывающим. Оба родителя должны быть одинаковыми. Итак, если вы создаете всплывающее окно внутри всплывающего окна, вы должны сохранить всплывающее окно родителя и сделать его родителем.
здесь пример
@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.показать() в 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(); } }); } });