Ich versuche, die Standardfarbe für das Optionsmenü zu ändern, das weiß ist: Ich möchte einen schwarzen Hintergrund für jedes Element im Optionsmenü.
Ich habe einige Aufnahmen wie android: itemBackground = "# 000000" für das item-Element im Menüelement versucht, aber es hat nicht funktioniert.
Wie kann ich das erreichen?
android
user-interface
layout-inflater
Feragusper
quelle
quelle
Antworten:
Nachdem ich viel Zeit damit verbracht hatte, alle Optionen auszuprobieren, konnte ich mit AppCompat v7 eine App zum Ändern des Hintergrunds des Überlaufmenüs erhalten, indem ich das Attribut itemBackground verwendete:
Getestet von API 4.2 bis 5.0.
quelle
Dies ist eindeutig ein Problem, das viele Programmierer haben und für das Google noch keine zufriedenstellende, unterstützte Lösung bereitstellen muss.
Es gibt viele gekreuzte Absichten und Missverständnisse in den Beiträgen zu diesem Thema. Lesen Sie daher bitte die gesamte Antwort, bevor Sie antworten.
Im Folgenden füge ich eine "verfeinerte" und gut kommentierte Version des Hacks aus anderen Antworten auf dieser Seite hinzu, die auch Ideen aus diesen sehr eng verwandten Fragen enthält:
Ändern Sie die Hintergrundfarbe des Android-Menüs
Wie ändere ich die Hintergrundfarbe des Optionsmenüs?
Android: Menü der Anwendung anpassen (z. B. Hintergrundfarbe)
http://www.macadamian.com/blog/post/android_-_theming_the_unthemable/
Android MenuItem Umschalttaste
Ist es möglich, den Hintergrund des Android-Optionsmenüs nicht durchscheinend zu machen?
http://www.codeproject.com/KB/android/AndroidMenusMyWay.aspx
Einstellen des Menühintergrunds auf undurchsichtig
Ich habe diesen Hack auf 2.1 (Simulator), 2.2 (2 echte Geräte) und 2.3 (2 echte Geräte) getestet. Ich habe noch keine 3.X-Tablets zum Testen, werde aber alle erforderlichen Änderungen hier veröffentlichen, wenn / falls ich dies tue. Angesichts der Tatsache, dass 3.X-Tablets Aktionsleisten anstelle von Optionsmenüs verwenden, wie hier erläutert:
http://developer.android.com/guide/topics/ui/menus.html#options-menu
Dieser Hack wird mit ziemlicher Sicherheit nichts (kein Schaden und kein Nutzen) auf 3.X-Tablets bewirken.
STELLUNGNAHME DES PROBLEMS (lesen Sie dies, bevor Sie mit einem negativen Kommentar auf den Auslöser antworten):
Das Optionsmenü hat auf verschiedenen Geräten sehr unterschiedliche Stile. Reines Schwarz mit weißem Text auf einigen, reines Weiß mit schwarzem Text auf einigen. Ich und viele andere Entwickler möchten die Hintergrundfarbe der Optionsmenüzellen sowie die Farbe des Optionsmenütextes steuern .
Bestimmte App-Entwickler müssen nur die Hintergrundfarbe der Zelle festlegen (nicht die Textfarbe), und dies können sie mit dem in einer anderen Antwort beschriebenen android: panelFullBackground-Stil sauberer tun. Derzeit gibt es jedoch keine Möglichkeit, die Textfarbe des Optionsmenüs mit Stilen zu steuern. Daher kann diese Methode nur verwendet werden, um den Hintergrund in eine andere Farbe zu ändern, die den Text nicht "verschwinden" lässt.
Wir würden dies gerne mit einer dokumentierten, zukunftssicheren Lösung tun, aber eine ist ab Android <= 2.3 einfach nicht verfügbar. Daher müssen wir eine Lösung verwenden, die in aktuellen Versionen funktioniert und die Wahrscheinlichkeit eines Absturzes / Bruches in zukünftigen Versionen minimiert. Wir wollen eine Lösung, die ordnungsgemäß zum Standardverhalten zurückfällt, wenn sie fehlschlagen muss.
Es gibt viele legitime Gründe, warum man möglicherweise das Aussehen von Optionsmenüs steuern muss (normalerweise, um einem visuellen Stil für den Rest der App zu entsprechen), damit ich nicht weiter darauf eingehen werde.
Es gibt einen Google Android-Fehler, der dazu gepostet wurde: Bitte fügen Sie Ihre Unterstützung hinzu, indem Sie diesen Fehler markieren (Hinweis: Google rät von "Ich auch" -Kommentaren ab: Nur ein Stern ist genug):
http://code.google.com/p/android/issues/detail?id=4441
ZUSAMMENFASSUNG DER LÖSUNGEN Bisher:
Mehrere Poster haben einen Hack mit LayoutInflater.Factory vorgeschlagen. Der vorgeschlagene Hack funktionierte für Android <= 2.2 und schlug für Android 2.3 fehl, da der Hack eine undokumentierte Annahme machte: Man könnte LayoutInflater.getView () direkt aufrufen, ohne sich derzeit in einem Aufruf von LayoutInflater.inflate () auf derselben LayoutInflater-Instanz zu befinden. Neuer Code in Android 2.3 hat diese Annahme gebrochen und zu einer NullPointerException geführt.
Mein leicht verfeinerter Hack unten beruht nicht auf dieser Annahme.
Darüber hinaus basieren die Hacks auch auf der Verwendung eines internen, nicht dokumentierten Klassennamens "com.android.internal.view.menu.IconMenuItemView" als Zeichenfolge (nicht als Java-Typ). Ich sehe keinen Weg, dies zu vermeiden und trotzdem das erklärte Ziel zu erreichen. Es ist jedoch möglich, den Hack auf eine vorsichtige Weise durchzuführen, die zurückfällt, wenn "com.android.internal.view.menu.IconMenuItemView" auf dem aktuellen System nicht angezeigt wird.
Verstehe wieder, dass dies ein Hack ist und ich behaupte keineswegs, dass dies auf allen Plattformen funktionieren wird. Aber wir Entwickler leben nicht in einer akademischen Fantasy-Welt, in der alles nach dem Buch sein muss: Wir haben ein Problem zu lösen und wir müssen es so gut wie möglich lösen. Beispielsweise ist es unwahrscheinlich, dass "com.android.internal.view.menu.IconMenuItemView" auf 3.X-Tablets vorhanden ist, da sie Aktionsleisten anstelle von Optionsmenüs verwenden.
Schließlich haben einige Entwickler dieses Problem gelöst, indem sie das Android-Optionsmenü vollständig unterdrückt und ihre eigene Menüklasse geschrieben haben (siehe einige der obigen Links). Ich habe das noch nicht ausprobiert, aber wenn Sie Zeit haben, Ihre eigene Ansicht zu schreiben und herauszufinden, wie Sie die Ansicht von Android ersetzen können (ich bin sicher, der Teufel steckt hier im Detail), ist dies möglicherweise eine nette Lösung, für die keine erforderlich ist undokumentierte Hacks.
HACKEN:
Hier ist der Code.
Um diesen Code zu verwenden, rufen Sie addOptionsMenuHackerInflaterFactory () EINMAL von Ihrer Aktivität onCreate () oder Ihrer Aktivität onCreateOptionsMenu () auf. Es wird eine Standardfactory festgelegt, die sich auf die spätere Erstellung eines Optionsmenüs auswirkt. Es hat keine Auswirkungen auf bereits erstellte Optionsmenüs (die vorherigen Hacks verwendeten den Funktionsnamen setMenuBackground (), was sehr irreführend ist, da die Funktion vor ihrer Rückkehr keine Menüeigenschaften festlegt).
Danke fürs Lesen und viel Spaß!
quelle
Das Stilattribut für den Menühintergrund lautet
android:panelFullBackground
.Trotz der Angaben in der Dokumentation muss es sich um eine Ressource handeln (z. B.
@android:color/black
oder@drawable/my_drawable
). Sie stürzt ab, wenn Sie einen Farbwert direkt verwenden.Dadurch werden auch die Artikelränder entfernt, die ich mit der Lösung von primalpop nicht ändern oder entfernen konnte.
Was die Textfarbe betrifft, habe ich in 2.2 keine Möglichkeit gefunden, sie durch Stile festzulegen, und ich bin sicher, dass ich alles ausprobiert habe (so habe ich das Menü-Hintergrundattribut entdeckt). Dafür müssten Sie die Lösung von primalpop verwenden.
quelle
Für Android 2.3 kann dies mit sehr starkem Hacking geschehen:
Die Hauptursache für die Probleme mit Android 2.3 ist, dass in LayoutInflater der mConstructorArgs [0] = mContext nur während der Ausführung von Aufrufen von festgelegt wird
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/view/LayoutInflater.java/#352
Ich habe es getestet, um mit Android 2.3 zu arbeiten und um noch mit früheren Versionen zu arbeiten. Wenn in späteren Android-Versionen erneut Probleme auftreten, wird stattdessen einfach der Standardmenüstil angezeigt
quelle
Ich bin auch auf dieses Problem gestoßen, und zwar auf einer App, die mit Gingerbread kompatibel sein musste und dennoch so viel Styling wie möglich von Holo-fähigen Geräten beibehält.
Ich habe eine relativ saubere Lösung gefunden, die für mich in Ordnung war.
Im Thema verwende ich einen 9-Patch-Hintergrund, um eine benutzerdefinierte Hintergrundfarbe zu erhalten:
Ich habe den Versuch, die Textfarbe zu formatieren, aufgegeben und nur ein Spannable verwendet, um die Textfarbe für mein Element im Code festzulegen:
quelle
So habe ich meine gelöst. Ich habe gerade die Hintergrundfarbe und die Textfarbe in Stilen angegeben. dh res> values> styles.xml Datei.
quelle
Eine Sache zu beachten, dass ihr das Problem genau wie viele andere Beiträge überkompliziert! Alles, was Sie tun müssen, ist, zeichnbare Selektoren mit dem gewünschten Hintergrund zu erstellen und sie auf tatsächliche Elemente zu setzen. Ich habe nur zwei Stunden damit verbracht, Ihre Lösungen auszuprobieren (alle auf dieser Seite vorgeschlagen), und keine davon hat funktioniert. Ganz zu schweigen davon, dass es Unmengen von Fehlern gibt, die Ihre Leistung in den Try / Catch-Blöcken, die Sie haben, wesentlich verlangsamen.
Sowieso ist hier eine Menü-XML-Datei:
Jetzt in Ihrem item1_selector:
Wenn Sie das nächste Mal über Kanada in den Supermarkt gehen, probieren Sie Google Maps!
quelle
Das funktioniert gut für mich
quelle
quelle
Danke Marcus! Es funktioniert reibungslos mit 2.3, indem einige Syntaxfehler behoben werden. Hier ist der feste Code
quelle
Dies ist eine XML-Datei
quelle
Wenn Sie eine beliebige Farbe festlegen möchten, scheint dies ziemlich gut zu funktionieren
androidx
. Getestet auf KitKat und Pie. Setzen Sie dies in IhreAppCompatActivity
:Hiermit wird die Farbe festgelegt
android.widget.PopupWindow$PopupBackgroundView
, die, wie Sie vielleicht vermutet haben, die Hintergrundfarbe zeichnet. Es gibt keine Überziehung und Sie können auch halbtransparente Farben verwenden.quelle