web-dev-qa-db-fra.com

BadTokenException: impossible d'ajouter window - le jeton null n'est pas valide; Votre activité est-elle en cours? en activité.

J'ai un popUpWindow qui doit être affiché, après quelques secondes si l'utilisateur est toujours en activité. J'ai implémenté stament qui vérifie si l'activité n'est pas finie/détruite, puis affiche le Popup, et cela fonctionne bien, pour les utilisateurs du week-end :) (en cliquant lentement d'une activité à l'autre), mais dans des conditions optimales (les activités sont en train d'être recréées, terminées ou rapides) activité à activité) qui me donne cette erreur:

E/UncaughtException: Android.view.WindowManager $ BadTokenException: Impossible d’ajouter window - le jeton null n’est pas valide; votre activité est-elle en cours d'exécution? sur Android.view.ViewRootImpl.setView (ViewRootImpl.Java:598) sur Android.view.WindowManagerGlobal.addView (WindowManagerGlobal .Java: 341) Sur Android.view.WindowManagerImpl.addView (WindowManagerImpl.Java:85) Sur Android.widget.PopupWindow.invokePopup (PopupWindow.Java:1279) sur Android.widget.PopupWindow.showAtLocation (PopupWindow.Java:1040) sur Android.widget.PopupWindow.showAtLocation (PopupWindow.Java:1003) sur com.guides4art.app.ImageSlider.RatePopUp $ 3.run (RatePopUp.Java:86) sur Android.os.Handler.handleCallback (Handler.Java:743) sur Android.os. Handler.dispatchMessage (Handler.Java:95) Sur Android.os.Looper.loop (Looper.Java:150) Sur Android.app.ActivityThread.main (ActivityThread.Java:5546) à Java.lang.reflect.Method.invoke (Méthode native) à avec.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:794) sur com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:684)

code:

   private void showPopUpWindow(final Activity context){


       popupWindow = new PopupWindow(context);

       LinearLayout.LayoutParams layoutParams =new LinearLayout.LayoutParams(
               LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
       popupWindow.setHeight(layoutParams.height);
       popupWindow.setWidth(layoutParams.width);
       popupWindow.setOutsideTouchable(true);
       popupWindow.setTouchable(true);
       popupWindow.setFocusable(true);
       popupWindow.setContentView(view);


       ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
           @Override
           public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
               if(context instanceof CarSale) {
                   ((CarSale) context).saveRate((int) rating);
                    ((CarSale) context).initRate();
                   title.setText(""+context.getString(R.string.thanksForRate));
               }
               else
                   Log.i("kamil","error");
           }
       });
       closeButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               popupWindow.dismiss();
           }
       });


if(!context.isFinishing() || !context.isDestroyed() )
               activityView.post(new Runnable() {
                   @Override
                   public void run() {
                       popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER,0,0);
                   }
               });
   }


//View Pager Class

 @Override
    public void onPageSelected(int position) {
        if(viewPager !=null){
        this.position=position;
        if(position==carList.size()-1 && isRated() && showRateBar)
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                 new RatePopUp(Cars.this,activityView);
                    showRateBar=false;
                }
            },5*SECOND);

//RatePopUp constructor

 public RatePopUp(Activity context,View activityView){
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.rate_popup_layout, null);
        this.activityView=activityView;
        ratingBar = (RatingBar) view.findViewById(R.id.ratingPop);
        title= (TextView)view.findViewById(R.id.rateTitle);
        title.setText(context.getString(R.string.rate_exhibition));
        closeButton = (Button)view.findViewById(R.id.close_button);
        Typeface  typeface =Typeface.createFromAsset(context.getAssets(),"fonts/fontawesome-webfont.ttf");
        closeButton.setTypeface(typeface);
        closeButton.setText(context.getString(R.string.exitIcon));
        showPopUpWindow(context);
    }
5
Expiredmind

essayez ce code:

 new Handler().postDelayed(new Runnable(){

    public void run() {
       popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER,0,0);
    }

}, 200L);

au lieu de:

popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER,0,0);

Assurez-vous également de passer ActivityName.this en tant que contexte .. pas getApplicationContext ()

Essayez de remplacer votre code runnable dans showPopUpWindow() par ceci:

runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (!isFinishing()) {
                popupWindow.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER, 0, 0);
            }
        }
    });
1
rafsanahmad007

Au lieu de 

if(!context.isFinishing())

essayer 

if(!((Activity) context).isFinishing())

A bien fonctionné pour moi.

1
shishir sahoo