10
votes

Appeler ShowAtlocation de PopUpwindow est en train de casser l'application

J'ai la classe qui s'étend à partir d'un et j'essaie d'afficher un popupwindow à l'aide de ce code xxx

mon application est écrasement lorsque vous essayez d'exécuter cette dernière ligne. Le message de l'exception est

ne peut pas créer de gestionnaire à l'intérieur du fil qui n'a pas appelé LOOPER.PREPARE ()

J'ai cherché des réponses liées à ce message et toutes impliquent que la popup était en cours de création sur un fil séparé et que je devrais utiliser RunonUthRead Mais si je suis à l'intérieur d'une vue ai-je besoin pour cela? Que peut être la cause de ce problème?


1 commentaires

Vous avez dit, avoir une erreur comme "Impossible de créer un gestionnaire à l'intérieur du fil qui n'a pas appelé looper.prepare ()", mais où vous mentionnez le code sur l'utilisation de "gestionnaire". S'il vous plaît expliquez-moi correctement avec votre code fait pour que je puisse essayer pour vous.


3 Réponses :


1
votes

Je suppose que cela peut être causé parce que vous essayez d'interférer avec votre UI à partir de threads non originaux (qui a créé l'interface utilisateur). Votre classe de visualisation personnalisée n'a pas d'accès à la modification de l'interface utilisateur afin que je pense que la meilleure façon de le faire est d'appeler runonuthread () . Bien que j'ai entendu dire qu'utiliser runonuthread ne soit pas le meilleur choix, mais il me semble que ce sera exactement ce dont vous avez besoin dans votre cas.

généralement pour obtenir ce travail, je fais une classe spéciale qui étend une application (dans mon cas c'est contextterter) et implémente une méthode comme celle-ci: xxx Ça m'aide à obtenir le contexte de l'application de partout. Vous devez également l'ajouter à votre manifeste comme ceci: xxx

et inclure toutes vos activités à l'intérieur de cette balise.

Lorsque vous avez votre contexte, vous pouvez faire votre contexte. Cette chose: xxx

Il peut sembler étrange mais il doit fonctionner pour vous. Il a l'air de cette façon parce que activité est dérivé du contexte . Chaque fois que vous essayez, j'aimerais savoir si cela fonctionnait. J'espère que j'ai aidé à la question


4 commentaires

J'appelle cela à partir de la même vue !!


Pourriez-vous me fournir un exemple spécifique


Croyez-le ou non, c'était juste une question d'offrir la prime et d'utiliser maintenant le même code que celui que j'ai posté ne fonctionne pas !!


@ Mauriciogracia c'est vraiment étrange mais de toute façon je suis content que cela fonctionne maintenant! Bonne chance avec le développement de Android



4
votes

Cela dépend de l'endroit où vous appelez showdialog (chaîne msg) , je sais que vous l'appeliez à partir de votre classe d'affichage, mais cela ne signifie pas que c'est sur le thread d'interface utilisateur, voir les appels sont traités sur Le fil de l'interface utilisateur, mais si vous faites une vue d'affichage dans un thread, vous aurez cette erreur. Je connais le même code résolu, mais si vous faites des travaux d'horlogerie ou des threads de votre classe d'affichage, vous devriez les vérifier. Et aussi au lieu de runonuthread , vous pouvez appeler message (exécutable); (le même mécanisme gestionnaire ) dans votre classe de visualisation, cela vous assurera que L'appel annoncé sera envoyé au fil principal.

En bref, vérifiez où vous l'appelez dans votre Voir Classe


2 commentaires

Et si un TimerSk appelle une méthode à partir de la vue indiquant la boîte de dialogue, dois-je utiliser Runduthread sur cet appel?


oui, comme vous avez, en tant que timerask exécute un thread différent - (il crée un nouveau fil), alors même si vous appelez vos méthodes dans une vue censée être sur le fil de l'interface utilisateur, ce n'est pas ... Tu me sens monsieur? Si vous souhaitez passer au fil de l'interface utilisateur dans votre classe d'affichage, utilisez la méthode postale, c'est la même que celle que, gestionnaire sa réponse @ Mauriciogracia



1
votes

dans Manifest

private void showCustomPopupMenu()
{
            windowManager2 = (WindowManager)getSystemService(WINDOW_SERVICE);
            LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view=layoutInflater.inflate(R.layout.xxact_copy_popupmenu, null);
            params=new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_PHONE,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);

            params.gravity=Gravity.CENTER|Gravity.CENTER;
            params.x=10;
            params.y=10;
            windowManager2.addView(view, params);  
}


0 commentaires