Ich versuche, das Drawable zu ändern, das sich im Suchansichts-Widget der Android-Aktionsleiste befindet.
Derzeit sieht es so aus:
aber ich muss den blauen Hintergrund, der gezeichnet werden kann, in eine rote Farbe ändern.
Ich habe viele Dinge versucht, ohne mein eigenes Such-Widget zu rollen, aber nichts scheint zu funktionieren.
Kann mich jemand in die richtige Richtung weisen, um dies zu ändern?
SearchView
Hintergrund nicht möglich, da es nicht in durch verfügbar istR.styleable
. Meine Antwort unten beschreibt, wie es im Code gemacht wird.Antworten:
Intro
Leider gibt es keine Möglichkeit, den
SearchView
Textfeldstil mithilfe von Themen, Stilen und Vererbung in XML festzulegen, wie dies mit dem Hintergrund von Elementen in der Dropdown-Liste "ActionBar" möglich ist . Dies liegt daran ,selectableItemBackground
wie styleable aufgeführt wird inR.stylable
, währendsearchViewTextField
(Thema Attribut , das uns interessiert) nicht. Daher können wir nicht einfach aus XML-Ressourcen darauf zugreifen (es wird eineNo resource found that matches the given name: attr 'android:searchViewTextField'
Fehlermeldung angezeigt).Festlegen des SearchView-Textfeldhintergrunds aus dem Code
Die einzige Möglichkeit, den Hintergrund eines
SearchView
Textfelds richtig zu ersetzen, besteht darin, in die Interna zu gelangen, Zugriff auf eine Ansicht zu erhalten, für die der Hintergrund basierend aufsearchViewTextField
unserem eigenen festgelegt und festgelegt wurde.ANMERKUNG: Die unten stehende Lösung hängt nur von der ID (
android:id/search_plate
) des darin enthaltenen Elements ab. DaherSearchView
ist die SDK-Version unabhängiger als das Durchlaufen von Kindern (z. B. VerwendensearchView.getChildAt(0)
, um zur richtigen Ansicht innerhalb des Elements zu gelangenSearchView
), sie ist jedoch nicht kugelsicher. Insbesondere wenn ein Hersteller beschließt, Interna von neu zu implementierenSearchView
und ein Element mit der oben genannten ID nicht vorhanden ist, funktioniert der Code nicht.Im SDK wird der Hintergrund für das Textfeld in
SearchView
durch neun Patches deklariert , sodass wir es auf die gleiche Weise tun. Sie können Original finden png Bilder in ziehbar-MDPI Verzeichnis von Android Git Repository . Wir sind an zwei Bildern interessiert. Eine für den Status, wenn ein Textfeld ausgewählt ist (mit dem Namen textfield_search_selected_holo_light.9.png ) und eine für den Ort, an dem es nicht ausgewählt ist (mit dem Namen textfield_search_default_holo_light.9.png ).Leider müssen Sie lokale Kopien beider Bilder erstellen, auch wenn Sie nur den fokussierten Status anpassen möchten . Dies liegt daran, dass
textfield_search_default_holo_light
in R.drawable nicht vorhanden ist . Daher ist es nicht leicht zugänglich über@android:drawable/textfield_search_default_holo_light
, was in der unten gezeigten Auswahl verwendet werden könnte, anstatt auf lokale Zeichen zu verweisen.HINWEIS: Ich habe das Holo Light- Thema als Basis verwendet, aber Sie können dasselbe mit Holo Dark tun . Es scheint, dass es in ausgewählten Status- 9-Patches keinen wirklichen Unterschied zwischen hellen und dunklen Themen gibt. Es gibt jedoch einen Unterschied bei 9 Patches für den Standardstatus (siehe Hell gegen Dunkel ). Daher ist es wahrscheinlich nicht erforderlich, lokale Kopien von 9 Patches für den ausgewählten Status sowohl für dunkle als auch für helle Themen zu erstellen (vorausgesetzt, Sie möchten beide behandeln und beide sehen genauso aus wie im Holo-Thema ). Erstellen Sie einfach eine lokale Kopie und verwenden Sie sie inAuswahl für beide Themen zeichnbar .
Jetzt müssen Sie die heruntergeladenen neun Patches nach Ihren Wünschen bearbeiten (dh die blaue Farbe in eine rote ändern). Sie können die Datei mit dem Draw 9-Patch-Tool überprüfen, um zu überprüfen, ob sie nach der Bearbeitung korrekt definiert ist.
Ich habe Dateien mit GIMP mit einem Ein-Pixel-Stift-Werkzeug bearbeitet (ziemlich einfach), aber Sie werden wahrscheinlich Ihr eigenes Werkzeug verwenden. Hier ist mein angepasster 9-Patch für den fokussierten Zustand :
HINWEIS: Der Einfachheit halber habe ich nur Bilder für die MDPI- Dichte verwendet. Sie müssen 9 Patches für mehrere Bildschirmdichten erstellen , wenn Sie auf jedem Gerät das beste Ergebnis erzielen möchten. Bilder für Holo
SearchView
finden Sie in mdpi , hdpi und xhdpi drawable.Jetzt müssen wir einen zeichnbaren Selektor erstellen, damit das richtige Bild basierend auf dem Ansichtsstatus angezeigt wird. Erstellen Sie eine Datei
res/drawable/texfield_searchview_holo_light.xml
mit folgendem Inhalt:Wir werden das oben erstellte Drawable verwenden, um den Hintergrund für die
LinearLayout
Ansicht festzulegen, in der sich das Textfeld befindetSearchView
- seine ID istandroid:id/search_plate
. So geht's im Code beim Erstellen des Optionsmenüs schnell:Endeffekt
Hier ist der Screenshot des Endergebnisses:
Wie ich dazu gekommen bin
Ich denke, es lohnt sich zu überlegen, wie ich dazu gekommen bin, damit dieser Ansatz beim Anpassen anderer Ansichten verwendet werden kann.
Ansichtslayout auschecken
Ich habe überprüft, wie das
SearchView
Layout aussieht. Im SearchView-Konstruktor finden Sie eine Linie, die das Layout aufbläst :Jetzt wissen wir, dass das
SearchView
Layout in der Datei mit dem Namen istres/layout/search_view.xml
. Wenn wir in search_view.xml schauen , können wir ein inneresLinearLayout
Element (mit IDsearch_plate
) finden, dasandroid.widget.SearchView$SearchAutoComplete
darin enthalten ist (sieht aus wie unser Textfeld in der Suchansicht ):Jetzt, da der Hintergrund basierend auf dem
searchViewTextField
Attribut des aktuellen Themas festgelegt ist .Untersuchungsattribut (ist es leicht einstellbar?)
Um zu überprüfen, wie das
searchViewTextField
Attribut festgelegt ist, untersuchen wir res / values / theme.xml .SearchView
Standardmäßig gibt es eine Gruppe von AttributenTheme
:Wir sehen, dass für das Standardthema der Wert ist
@drawable/textfield_searchview_holo_dark
. FürTheme.Light
Wert wird auch in dieser Datei gesetzt .Nun, es wäre großartig, wenn dieses Attribut über R.styleable zugänglich wäre , aber leider nicht. Zum Vergleich : Andere Thema Attribute , die vorhanden sind beide in themes.xml und R.attr wie textAppearance oder selectableItemBackground . Wenn
searchViewTextField
inR.attr
(undR.stylable
) vorhanden, könnten wir einfach unseren zeichnbaren Selektor verwenden, um das Thema für unsere gesamte Anwendung in XML zu definieren. Beispielsweise:Was sollte geändert werden?
Jetzt wissen wir, dass wir
search_plate
über Code zugreifen müssen. Wir wissen jedoch immer noch nicht, wie es aussehen soll. Kurz gesagt, wir suchen nach Drawables, die in Standardthemen als Werte verwendet werden: textfield_searchview_holo_dark.xml und textfield_searchview_holo_light.xml . Wenn wir uns den Inhalt ansehen, sehen wir, dass das Drawableselector
zwei andere Drawables (die später 9 Patches sind) basierend auf dem Ansichtsstatus referenziert. Auf androiddrawables.com finden Sie aggregierte 9-Patch-Drawables von (fast) allen Android- VersionenCustomizing
Wir erkennen die blaue Linie in einem der 9 Patches , erstellen also eine lokale Kopie davon und ändern die Farben nach Wunsch.
quelle
SearchView
selbst konzentriert ). Ist es in Ordnung, wenn ich Ihre Antwort (überschreibe onCreateOptionsMenu) mit meiner zusammenführe?onCreate()
Methode zuonCreateOptionsMenu()
Methode verschoben , wie Sie vorgeschlagen haben. Hat Ihre Antwort gewählt.Die oben genannten Lösungen funktionieren möglicherweise nicht, wenn Sie die Appcompat-Bibliothek verwenden. Möglicherweise müssen Sie den Code ändern, damit er für die Appcompat-Bibliothek funktioniert.
Hier ist die Arbeitslösung für die Appcompat-Bibliothek.
quelle
Ihre
onCreateOptionsMenu
Methode muss sein:wo Ihr Suchbegriff
menu_search
vom Kurs abweichtund hier ist die
searchviewredversion
(dies ist die xhdpi-Version): http://img836.imageshack.us/img836/5964/searchviewredversion.pngquelle
Die obige Lösung funktioniert nicht mit ActionBarSherlock 4.2 und ist daher nicht abwärtskompatibel mit Android 2.x. Hier ist Arbeitscode, der den SearchView-Hintergrund und den Hinweistext in ActionBarSherlock 4.2 einrichtet:
quelle
Ich habe es auch satt und benutze v7. Die Anwendung stürzte ab, als ich versuchte, die
searchPlate
Via zu greifen,getIdentifier()
also habe ich es so gemacht:quelle
Ich hatte auch das gleiche Problem. Ich habe die Appcompat v7-Bibliothek verwendet und einen benutzerdefinierten Stil dafür definiert. Legen Sie in einem zeichnbaren Ordner die Datei bottom_border.xml ab, die folgendermaßen aussieht:
Im Werteordner styles_myactionbartheme.xml:
Ich habe die Datei custommenu.xml für die Anzeige des Menüs definiert:
Ihre Aktivität sollte ActionBarActivity anstelle von Activity erweitern.
In der Manifestdatei:
Weitere Informationen finden Sie hier:
Hier http://www.jayway.com/2014/06/02/android-theming-the-actionbar/
quelle
Aktualisieren
Wenn Sie AndroidX verwenden, können Sie dies folgendermaßen tun
quelle
Zuerst erstellen wir eine XML-Datei mit dem Namen search_widget_background.xml, die als Drawable verwendet werden soll, dh unter einem Drawable-Verzeichnis.
Dieses Zeichen wird als Hintergrund für unser Such-Widget verwendet. Ich habe die Farbe auf Rot gesetzt, weil Sie danach gefragt haben, aber Sie können sie auf jede Farbe setzen, die durch das @ color-Tag definiert ist. Sie können es sogar mithilfe der für das Form-Tag definierten Attribute weiter ändern (abgerundete Ecken erstellen, einen ovalen Hintergrund erstellen usw.).
Der nächste Schritt besteht darin, den Hintergrund unseres Such-Widgets auf diesen zu setzen. Dies kann durch Folgendes erreicht werden:
quelle
SearchView
(benanntsearch_plate
) gesetzt werden muss, nicht auf sichSearchView
selbst. Siehe meine Antwort für weitere Details. Ich muss jedoch zugeben, dass ich nicht versucht habe, die Antwort von @ (baba tenor) zu verwenden.SearchView
Hintergrund für Elemente, die sich im Inneren befinden, immer unter dem Hintergrund liegtSearchView
. Es gibt eineLinearLayout
AnsichtSearchView
mit der IDsearch_plate
, die dieses blaue Unterstreichungselement als Hintergrund festlegt. Siehe meine Antwort für Details. Bei Ihrer Lösung ist das Ergebnis ein blauer Hintergrund für das gesamte Widget, wobei die blaue Unterstreichung weiterhin sichtbar ist. Ich habe auf Jelly Bean getestet , aber ich denke nicht, dass die SDK-Zielversion hier wichtig ist.und dies ist die Datei searchablecolor.xml
quelle
Ich habe am Ende dieses Beitrags mit Bildern erklärt, dass dies für Xamarin-Formen gilt. Aber ich denke, Sie können es verstehen, weil es auf dem Quellcode der Suchansicht von Android basiert
So ändern Sie das Bild der Schaltfläche zum Abbrechen der Suchleiste in Xamarin-Formularen
quelle
Wenn Sie Searchview wie folgt aufblasen "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Anschließend können Sie diese Suchansicht über style.xml wie unten angepasst anpassen.
quelle
Ich habe viel darüber nachgedacht und schließlich habe ich diese Lösung gefunden und sie funktioniert für mich!
Sie können dies verwenden
Wenn Sie appcompat verwenden, versuchen Sie Folgendes:
Wenn Sie Androidx verwenden, versuchen Sie dies:
Das Standard-Serchview-Symbol wird geändert.
Ich hoffe es hilft!
quelle