Ich habe den folgenden Fehler beim Anzeigen eines PopupWindow. Die Fehler werden durch die Zeile ausgelöst:
checkInPopup.showAtLocation((ViewGroup) mapView.getParent(), Gravity.CENTER_HORIZONTAL, 0, 0);
mapView ist eine MapView und nichts ist null. Die Stapelspur:
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)
Dies ist der Code aus meiner Aktivität (der MapActivity erweitert)
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);
}
Vielen Dank für Ihre Meinung
Das gleiche Problem trat bei mir auf, als ich versuchte, das Popup-Menü in der Aktivität anzuzeigen. Ich habe auch die gleiche Ausnahme, aber ich stoße auf ein Problem, das durch die Bereitstellung des Kontexts gelöst werden kann
YourActivityName.this
stattgetApplicationContext()
umDialog dialog = new Dialog(getApplicationContext());
und ja, es hat bei mir funktioniert, vielleicht hilft es jemand anderem
quelle
Verwenden:
YourActivityName.this
Anstatt:
getApplicationContext();
quelle
Es gibt zwei Szenarien, in denen diese Ausnahme auftreten kann. Einer wird von Nandeesh erwähnt. Ein anderes Szenario wird hier erwähnt: http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/
Stellen Sie sicher, dass Sie beide behandeln
quelle
@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); } }
Der richtige Weg ist popupwindow.show () bei onWindowFocusChanged ().
quelle
Das Elternteil eines Popups kann selbst kein Popup sein. Beide Eltern müssen gleich sein. Wenn Sie also ein Popup in einem Popup erstellen, müssen Sie das Popup des übergeordneten Elements speichern und zu einem übergeordneten Element machen.
Hier ist ein Beispiel
quelle
Versuchen Sie, den Pop wie unten zu zeigen
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(); } }); } });
quelle
Verwenden Sie diese Methode vor der Show
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; }
quelle
Versuche es zu benutzen
LayoutInflater inflater = (LayoutInflater).getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflate.from(YourActivity.this).inflate(R.layout.yourLayout, null);
quelle
Nach vielen Stunden des Suchens und Testens fand ich folgende Lösung (durch Implementierung verschiedener SO-Lösungen) hier, was auf keinen Fall fehlschlug, ich bekam einen Absturz.
Runnable runnable = new Runnable() { @Override public void run() { //displayPopup,progress dialog or what ever action. example ProgressDialogBox.setProgressBar(Constants.LOADING,youractivityName.this); }};
Wenn logcat anzeigt, dass der Absturz stattfindet, starten Sie in meinem Fall eine ausführbare Datei, wenn Sie eine Sendung empfangen.
runOnUiThread(new Runnable() { @Override public void run() { if(!isFinishing()) { new Handler().postAtTime(runnable,2000); } } });
quelle
Versuchen Sie, Popup wie folgt anzuzeigen
new Handler().postDelayed(new Runnable(){ public void run() { popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER,0,0); } }, 200L);
quelle