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);
}
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);
}
}
});
Au lieu de
if(!context.isFinishing())
essayer
if(!((Activity) context).isFinishing())
A bien fonctionné pour moi.