web-dev-qa-db-ja.com

BadTokenException:ウィンドウを追加できません-トークンnullは無効です;あなたの活動は実行されていますか? in activity.isFinishingステートメント

ユーザーがまだ現在のアクティビティを行っている場合、数秒後に表示する必要があるpopUpWindowがあります。アクティビティが完了/破棄されていないかどうかを確認してポップアップを表示する文を実装しました。週末のユーザーの場合は正常に機能します:)(アクティビティからアクティビティへゆっくりクリック)が、高圧テスト(アクティビティは再作成、完了、高速移動フォーム)活動から活動へ)それは私にそのエラーを与えます:

E/UncaughtException:Android.view.WindowManager $ BadTokenException:Unable to add window-token null is not valid;あなたの活動は実行されていますか? Android.view.WindowManagerGlobal.addView(WindowManagerGlobal.Java:341)at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:85)at Android.widget。 PopupWindow.invokePopup(PopupWindow.Java:1279)at Android.widget.PopupWindow.showAtLocation(PopupWindow.Java:1040)at Android.widget.PopupWindow.showAtLocation(PopupWindow.Java:1003)at com.guides4art.app.ImageSlider.RatePopUp $ 3.run(RatePopUp.Java:86)at Android.os.Handler.handleCallback(Handler.Java:743)at Android.os.Handler.dispatchMessage(Handler.Java:95)at Android.os.Looper.loop(Looper .Java:150)at Android.app.ActivityThread.main(ActivityThread.Java:5546)at Java.lang.reflect.Method.invoke(Native Method)at com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit .Java:794)com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:684)で

コード:

   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);
    }
7
Expiredmind

このコードを試してください:

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

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

}, 200L);
_

の代わりに:

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

また、_ActivityName.this_をコンテキストとして渡してください。getApplicationContext()ではありません。

showPopUpWindow()runnableコードを次のコードに置き換えてみてください:

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

の代わりに

if(!context.isFinishing())

試す

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

私にとってはうまくいきました。

1
shishir sahoo