J'essaie de changer la couleur par défaut du menu d'options qui est blanc: je veux un fond noir pour chaque élément du menu d'options.
J'ai essayé quelques prises de vue comme android: itemBackground = "# 000000" sur l'élément item dans l'élément menu mais cela n'a pas fonctionné.
Comment puis-je accomplir cela?
android
user-interface
layout-inflater
feragusper
la source
la source
Réponses:
Après avoir passé un temps considérable à essayer toutes les options, la seule façon d'obtenir une application utilisant AppCompat v7 pour modifier l'arrière-plan du menu de débordement était d'utiliser l'attribut itemBackground:
Testé de l'API 4.2 à 5.0.
la source
C'est clairement un problème rencontré par de nombreux programmeurs et auquel Google n'a pas encore fourni de solution satisfaisante et prise en charge.
Il y a beaucoup d'intentions croisées et de malentendus flottant autour des articles sur ce sujet, alors veuillez lire toute cette réponse avant de répondre.
Ci-dessous, j'inclus une version plus "raffinée" et bien commentée du hack d'autres réponses sur cette page, incorporant également des idées de ces questions très étroitement liées:
Changer la couleur d'arrière-plan du menu Android
Comment changer la couleur de fond du menu d'options?
Android: personnaliser le menu de l'application (par exemple, la couleur de fond)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Bouton Android Menu
Est-il possible de rendre l'arrière-plan du menu des options Android non translucide?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Définition de l'arrière-plan du menu pour être opaque
J'ai testé ce hack sur 2.1 (simulateur), 2.2 (2 vrais appareils) et 2.3 (2 vrais appareils). Je n'ai pas encore de tablette 3.X à tester, mais je publierai les modifications nécessaires ici si / si je le fais. Étant donné que les tablettes 3.X utilisent des barres d'action au lieu des menus d'options, comme expliqué ici:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
ce hack ne fera presque certainement rien (ni mal ni bon) sur les tablettes 3.X.
ÉNONCÉ DU PROBLÈME (lisez ceci avant de répondre au déclencheur avec un commentaire négatif):
Le menu Options a des styles très différents sur différents appareils. Noir pur avec du texte blanc sur certains, blanc pur avec du texte noir sur certains. Moi-même et de nombreux autres développeurs souhaitons contrôler la couleur d'arrière-plan des cellules du menu Options ainsi que la couleur du texte du menu Options .
Certains développeurs d'applications n'ont besoin que de définir la couleur d'arrière-plan de la cellule (pas la couleur du texte), et ils peuvent le faire de manière plus propre en utilisant le style android: panelFullBackground décrit dans une autre réponse. Cependant, il n'existe actuellement aucun moyen de contrôler la couleur du texte du menu Options avec des styles, et on ne peut donc utiliser cette méthode que pour changer l'arrière-plan en une autre couleur qui ne fera pas «disparaître» le texte.
Nous serions ravis de le faire avec une solution documentée et pérenne, mais l'une d'entre elles n'est tout simplement pas disponible à partir d'Android <= 2.3. Nous devons donc utiliser une solution qui fonctionne dans les versions actuelles et qui est conçue pour minimiser les risques de plantage / rupture dans les versions futures. Nous voulons une solution qui échoue correctement au comportement par défaut si elle doit échouer.
Il existe de nombreuses raisons légitimes pour lesquelles il peut être nécessaire de contrôler l'apparence des menus d'options (généralement pour correspondre à un style visuel pour le reste de l'application), je ne m'attarderai donc pas là-dessus.
Il y a un bug Google Android à ce sujet: veuillez ajouter votre soutien en mettant en vedette ce bug (notez que Google décourage les commentaires "moi aussi": juste une étoile suffit):
http://code.google.com/p/android/issues/detail?id=4441
RÉSUMÉ DES SOLUTIONS À CE JOUR:
Plusieurs affiches ont suggéré un hack impliquant LayoutInflater.Factory. Le piratage suggéré a fonctionné pour Android <= 2.2 et a échoué pour Android 2.3 parce que le piratage a fait une hypothèse non documentée: qu'on pourrait appeler LayoutInflater.getView () directement sans être actuellement dans un appel à LayoutInflater.inflate () sur la même instance de LayoutInflater. Le nouveau code dans Android 2.3 a cassé cette hypothèse et a conduit à une NullPointerException.
Mon hack légèrement raffiné ci-dessous ne repose pas sur cette hypothèse.
En outre, les hacks reposent également sur l'utilisation d'un nom de classe interne non documenté "com.android.internal.view.menu.IconMenuItemView" en tant que chaîne (pas en tant que type Java). Je ne vois aucun moyen d'éviter cela et d'atteindre toujours l'objectif déclaré. Cependant, il est possible de faire le piratage d'une manière prudente qui se rabattra si "com.android.internal.view.menu.IconMenuItemView" n'apparaît pas sur le système actuel.
Encore une fois, comprenez qu'il s'agit d'un hack et je ne prétends en aucun cas que cela fonctionnera sur toutes les plates-formes. Mais nous, les développeurs, ne vivons pas dans un monde académique fantastique où tout doit être écrit: nous avons un problème à résoudre et nous devons le résoudre du mieux que nous pouvons. Par exemple, il semble peu probable que "com.android.internal.view.menu.IconMenuItemView" existe sur les tablettes 3.X car elles utilisent des barres d'action au lieu des menus d'options.
Enfin, certains développeurs ont résolu ce problème en supprimant totalement le menu d'options Android et en écrivant leur propre classe de menu (voir certains des liens ci-dessus). Je n'ai pas essayé cela, mais si vous avez le temps d'écrire votre propre vue et de trouver comment remplacer la vue d'Android (je suis sûr que le diable est dans les détails ici), alors cela pourrait être une bonne solution qui ne nécessite aucun hacks non documentés.
PIRATER:
Voici le code.
Pour utiliser ce code, appelez addOptionsMenuHackerInflaterFactory () UNE FOIS depuis votre activité onCreate () ou votre activité onCreateOptionsMenu (). Il définit une usine par défaut qui affectera la création ultérieure de tout menu d'options. Cela n'affecte pas les menus d'options qui ont déjà été créés (les hacks précédents utilisaient un nom de fonction de setMenuBackground (), ce qui est très trompeur car la fonction ne définit aucune propriété de menu avant son retour).
Merci d'avoir lu et amusez-vous!
la source
L'attribut de style pour l'arrière-plan du menu est
android:panelFullBackground
.Malgré ce que dit la documentation, il doit s'agir d'une ressource (par exemple
@android:color/black
ou@drawable/my_drawable
), il plantera si vous utilisez directement une valeur de couleur.Cela supprimera également les bordures des éléments que je n'ai pas pu modifier ou supprimer à l'aide de la solution de primalpop.
En ce qui concerne la couleur du texte, je n'ai trouvé aucun moyen de la définir via les styles de la version 2.2 et je suis sûr que j'ai tout essayé (c'est ainsi que j'ai découvert l'attribut d'arrière-plan du menu). Vous auriez besoin d'utiliser la solution de primalpop pour cela.
la source
Pour Android 2.3, cela peut être fait avec un piratage très lourd:
La cause première des problèmes avec Android 2.3 est que dans LayoutInflater, mConstructorArgs [0] = mContext n'est défini que lors des appels à
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352
Je l'ai testé pour fonctionner sur Android 2.3 et pour continuer à fonctionner sur des versions antérieures. Si quelque chose se brise à nouveau dans les versions ultérieures d'Android, vous verrez simplement le style de menu par défaut à la place
la source
Je viens de rencontrer ce problème aussi, sur une application qui devait être compatible avec Gingerbread tout en conservant autant que possible le style des appareils compatibles Holo.
J'ai trouvé une solution relativement propre, qui a bien fonctionné pour moi.
Dans le thème, j'utilise un arrière-plan dessinable à 9 patchs pour obtenir une couleur d'arrière-plan personnalisée:
J'ai renoncé à essayer de styliser la couleur du texte et j'ai simplement utilisé un Spannable pour définir la couleur du texte de mon élément dans le code:
la source
C'est ainsi que j'ai résolu le mien. Je viens de spécifier la couleur d'arrière-plan et la couleur du texte dans les styles. ie res> values> fichier styles.xml.
la source
Une chose à noter que vous compliquez trop le problème, tout comme beaucoup d'autres articles! Tout ce que vous avez à faire est de créer des sélecteurs dessinables avec les arrière-plans dont vous avez besoin et de les définir sur des éléments réels. Je viens de passer deux heures à essayer vos solutions (toutes suggérées sur cette page) et aucune d'elles n'a fonctionné. Sans oublier qu'il existe des tonnes d'erreurs qui ralentissent essentiellement vos performances dans les blocs try / catch que vous avez.
Quoi qu'il en soit, voici un fichier xml de menu:
Maintenant dans votre item1_selector:
La prochaine fois que vous décidez d'aller au supermarché à travers le Canada, essayez google maps!
la source
cela fonctionne bien pour moi
la source
la source
Merci Marcus! Il fonctionne sur 2.3 en douceur en corrigeant certaines erreurs de syntaxe, voici le code corrigé
la source
c'est un fichier XML
la source
Si vous souhaitez définir une couleur arbitraire, cela semble plutôt bien fonctionner
androidx
. Testé sur KitKat et Pie. Mettez ceci dans votreAppCompatActivity
:Cela définit la couleur de
android.widget.PopupWindow$PopupBackgroundView
, qui, comme vous l'avez peut-être deviné, dessine la couleur d'arrière-plan. Il n'y a pas de dégagement et vous pouvez également utiliser des couleurs semi-transparentes.la source