2017-01-16 2 views
3

Ich habe ein PopUpWindow, das angezeigt werden muss, nach ein paar Sekunden, wenn der Benutzer noch auf der aktuellen Aktivität ist. Ich implementierte stament, die überprüfen, ob die Aktivität nicht beendet/zerstört und dann das Popup angezeigt wird, und es funktioniert gut für Wochenendbenutzer :) (langsames Klicken von Aktivität zu Aktivität), aber in hohen Drucktests (Aktivitäten sind neu erstellen, fertig, schnelle Bewegung Aktivität zu Aktivität), die mir diesen Fehler gibt:BadTokenException: Fenster konnte nicht hinzugefügt werden - Token-Null ist nicht gültig; läuft deine Aktivität? in activity.isFinishing Statement

E/UncaughtException: android.view.WindowManager $ BadTokenException: Unable Fenster hinzuzufügen - Token null ist nicht gültig; Ist Ihre Aktivität läuft? bei android.view.ViewRootImpl.setView (ViewRootImpl.java:598) bei android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:341) bei android.view.WindowManagerImpl.addView (WindowManagerImpl.java:85) bei android.widget.PopupWindow.invokePopup (PopupWindow.java:1279) bei android.widget.PopupWindow.showAtLocation (PopupWindow.java:1040) bei android.widget.PopupWindow.showAtLocation (PopupWindow.java:1003) bei com .guides4art.app.ImageSlider.RatePopUp $ 3.run (RatePopUp.java:86) bei android.os.Handler.handleCallback (Handler.java:743) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:150) bei android.app.ActivityThread.main (ActivityThread.java:5546) bei java .lang.reflect.Method.invoke (Native Methode) um com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:794) bei 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); 
    } 
+0

wie rufen Sie 'showPopUpWindow' – rafsanahmad007

+0

Ich füge den Rest des Codes – Expiredmind

Antwort

0

versuchen diesen Code:

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

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

}, 200L); 

statt:

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

Auch stellen Sie sicher, ActivityName.this als Kontext passieren .. nicht getApplicationContext()

Versuchen Sie Ihr runnable Code in showPopUpWindow() ersetzen dies:

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

leider nicht helfen:/ – Expiredmind

+0

Ich habe die Antwort bearbeitet ... @ Expiredmind – rafsanahmad007

0

Statt

if(!context.isFinishing()) 

versuchen

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

gut für mich gearbeitet.

Verwandte Themen