0

J'ai ajouté le code suivant pour afficher un Popover sur ma vue spinner. Le code utilise PopOver personnalisé qui étend popupWindow:

@Override 
    public void onStart() { 
     super.onStart(); 

      new Handler().postDelayed(new Runnable() { 
       public void run() { 
        if (mActivity == null || !isAdded() || mActivity.isFinishing() || mSpinner == null) { 
         return; 
        } 

        displayPopOver(); 
       } 
      }, 500L); // have seen BadTokenException if we try to show the popup too early 
    } 


    private void displayPopOver() { 
    //PopOver is a custom class that extends PopupWindow 
    PopOver p = PopOver.createVerticalPopOver(mActivity, PopOver.Type.TIP); 
    p.show(mSpinner); 
    } 

Je ne peux pas reproduire l'accident, mais par des rapports d'erreur, je vois l'application se bloque plusieurs fois. Qu'est-ce que je fais mal? Peut-on appeler ce code dans onResume() au lieu de onStart()?

android.view.WindowManager $ BadTokenException: Impossible d'ajouter la fenêtre - null jeton est pas valide; Votre activité est-elle en cours? 1 à android.view.ViewRootImpl.setView (ViewRootImpl.java:532) 2 à android.view.WindowManagerGlobal.addView (WindowManagerGlobal.java:259) 3 à android.view.WindowManagerImpl.addView (WindowManagerImpl.java:69) 4 à android.widget.PopupWindow.invokePopup (PopupWindow.java:1019) 5 à android.widget.PopupWindow.showAtLocation (PopupWindow.java:850) 6 à android.widget.PopupWindow.showAtLocation (PopupWindow.java: 814) 7 à com.PopOver.show (PopOver.java:339) 8 à com.MainFragment.displayPopOver (MainFragment.java:515) 9 à com.MainFragment.access 1300 $ (MainFragment.java:73) 10 at com.MainFragment $ 5.run (MainFragment.java:497) 11 sur android.o s.Handler.handleCallback (Handler.java:733) 12 à android.os.Handler.dispatchMessage (Handler.java:95) 13 à android.os.Looper.loop (Looper.java:136) 14 à androïde .app.ActivityThread.main (ActivityThread.java:5001) 15 à java.lang.reflect.Method.invokeNative (Méthode native) 16 à java.lang.reflect.Method.invoke (Method.java:515) 17 à com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:785) 18 à com.android.internal.os.ZygoteInit.main (ZygoteInit.java:601) 19 à dalvik.system.NativeStart .main (méthode native)

+0

moyens pop-up est plus Spinner ou activité? –

+0

La popup est sur spinner –

+0

où vous créez spinner –

Répondre

2

L'exception étant indication jetée ates que vous montrez la coutume PopupWindowaussi bientôt.

Bien que le délai 500 ms puisse résoudre le problème sur certains périphériques, ce n'est pas la solution. Vous remarquerez que si vous augmentez le délai pour dire 1000 ms, le problème disparaîtra probablement pour de bon. Ceci encore, est pas la solution.

Pour garantie, adopter la méthode suivante:

Laissez l'activité vous dire quand il est prêt à montrer votre PopupWindow. Dans votre cas, cela pourrait être mis en place dès que vous pouvez trouver le Spinner:

mSpinner = (Spinner) findViewById(R.id.spinner); 

Ensuite, poster un Runnable à lui:

mSpinner.post(new Runnable() { 
    public void run() { 
     displayPopOver(); 
    } 
}); 

Aucun délai nécessaire ici.

+0

J'ai déjà mis ce changement, mais au lieu de le mettre en activité je l'ai mis dans onResume et vérifier si mSpinner n'est pas nul avant d'appeler mSpinner.post –

+0

@PriyaB Oui, cela devrait fonctionner correctement. – Vikram

0

Premièrement:

mActivity 

Assurez-vous ne tenez pas à la référence de l'activité. Il y a des moyens plus faciles, c'est-à-diregetActivity() du fragment. Ce qui retournera automatiquement null si votre fragment est détaché. isAdded() renvoie automatiquement la valeur false lorsque le fragment est en état détaché. Donc, arrêtez de conserver des références d'activité supplémentaires, ou des variables d'état fragmentées, elles ne sont pas automatiquement mises à jour.

et ensuite:

Lorsque vous planifiez un runnable qui est censé faire quelque chose avec l'interface utilisateur, puis garder à l'esprit que Android Activity, Fragment ou View, ainsi que son interface utilisateur peut tout simplement disparaître à tout moment. Donc, rappelez-vous pour annuler ce runnable du gestionnaire lorsque l'interface utilisateur disparaît. C'est-à-dire onStop() d'activité et onDestroyView() de fragments et onDetachedFromWindow() de vues personnalisées.

aussi:

un meilleur contrôle serait:

if (getActivity() != null && isAdded() && !getActivity().isFinishing() && mSpinner != null) { 
    // do stuff 
}