При отображении PopupWindow возникает следующая ошибка. Ошибки вызываются строкой:
checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0);
mapView - это MapView, и ничего не имеет значения NULL. Трассировка стека:
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);
}
Спасибо, что поделились своими мыслями
Та же проблема произошла со мной, когда я пытаюсь показать всплывающее меню в действии, у меня тоже есть такое же исключение, но я сталкиваюсь с проблемой, которую нужно решить, предоставив контекст
YourActivityName.this
вместо того , чтобыgetApplicationContext()
вDialog dialog = new Dialog(getApplicationContext());
и да, это сработало для меня, может это поможет кому-то другому
источник
Использование:
YourActivityName.this
Вместо:
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.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(); } }); } });
источник
используйте этот метод перед шоу
public static ViewGroup getActivityFirstLayout(Context ctx) { return (ViewGroup)((ViewGroup) ActivityMaster.getActivity(ctx).findViewById(android.R.id.content)).getChildAt(0); } private boolean activityIsOk(Activity activity) { boolean s1 = !(activity == null || activity.isFinishing()); if(s1) { View v = LayoutMaster.getActivityFirstLayout(activity); return v.isShown() && ViewCompat.isLaidOut(v); } return false; }
источник
Попробуйте использовать это
LayoutInflater inflater = (LayoutInflater).getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflate.from(YourActivity.this).inflate(R.layout.yourLayout, null);
источник
После многих часов поиска и тестирования я нашел следующее решение (путем реализации различных решений SO) здесь, что не привело к сбою, в любом случае я получал сбой.
Runnable runnable = new Runnable() { @Override public void run() { //displayPopup,progress dialog or what ever action. example ProgressDialogBox.setProgressBar(Constants.LOADING,youractivityName.this); }};
Где logcat указывает, что сбой происходит ... запустите работающий. В моем случае при приеме трансляции.
runOnUiThread(new Runnable() { @Override public void run() { if(!isFinishing()) { new Handler().postAtTime(runnable,2000); } } });
источник
попробуйте показать всплывающее окно, подобное этому
new Handler().postDelayed(new Runnable(){ public void run() { popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER,0,0); } }, 200L);
источник