82 votes

PopupWindow $BadTokenException : impossible d'ajouter une fenêtre -- le jeton null n'est pas valide

J'ai l'erreur suivante lors de l'affichage d'un PopupWindow. Les erreurs sont déclenchées par la ligne :

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

mapView est un MapView et rien n'est nul. La trace de pile :

 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)

Ceci est le code de mon activité (qui étend 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);
}

Merci d'avoir partagé vos pensées

95voto

Le même problème s'est produit avec moi lorsque j'ai essayé d'afficher le menu contextuel dans l'activité.

YourActivityName.this au lieu de getApplicationContext() à

Dialog dialog = new Dialog(getApplicationContext());

et oui cela a fonctionné pour moi peut-être que cela aidera quelqu'un d'autre

74voto

nandeesh Points 16095

vous affichez votre popup trop tôt. Vous pouvez publier un exécutable retardé pour showatlocation dans Onresume, essayez-le

Éditer: Ce message semble avoir le même problème résolu Problèmes de création d'une fenêtre contextuelle dans l'activité Android

35voto

Utilisation:

 YourActivityName.this

À la place de:

 getApplicationContext();

10voto

TheMan Points 331

Il existe deux scénarios dans lesquels cette exception peut se produire. L'un est mentionné par nandeesh. Un autre scénario est mentionné ici : http://blackriver.to/2012/08/android-annoying-exception-unable-to-add-window-is-your-activity-running/

Assurez-vous de gérer les deux

5voto

Wow Chong Points 41
  @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);
    }
}

la bonne méthode est popupwindow.show() à onWindowFocusChanged().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X