Ich versuche, das Drawable zu ändern, das sich im Android actionbar searchview widget befindet.
Derzeit sieht es so aus:
aber ich muss den blauen Hintergrund, der in eine rote Farbe gezeichnet werden kann, ändern.
Ich habe viele Dinge versucht, außer mein eigenes Such-Widget zu rollen, aber nichts scheint zu funktionieren.
Kann mich jemand in die richtige Richtung weisen, um dies zu ändern?
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 funktionierende Lösung für die AppCompat-Bibliothek.
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
searchAutoComplete.setHintTextColor(Color.WHITE);
searchAutoComplete.setTextColor(Color.WHITE);
View searchplate = (View)searchView.findViewById(Android.support.v7.appcompat.R.id.search_plate);
searchplate.setBackgroundResource(R.drawable.texfield_searchview_holo_light);
ImageView searchCloseIcon = (ImageView)searchView.findViewById(Android.support.v7.appcompat.R.id.search_close_btn);
searchCloseIcon.setImageResource(R.drawable.abc_ic_clear_normal);
ImageView voiceIcon = (ImageView)searchView.findViewById(Android.support.v7.appcompat.R.id.search_voice_btn);
voiceIcon.setImageResource(R.drawable.abc_ic_voice_search);
ImageView searchIcon = (ImageView)searchView.findViewById(Android.support.v7.appcompat.R.id.search_mag_icon);
searchIcon.setImageResource(R.drawable.abc_ic_search);
return super.onCreateOptionsMenu(menu);
}
Ihre onCreateOptionsMenu
Methode muss sein:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.option, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
int linlayId = getResources().getIdentifier("Android:id/search_plate", null, null);
ViewGroup v = (ViewGroup) searchView.findViewById(linlayId);
v.setBackgroundResource(R.drawable.searchviewredversion);
return super.onCreateOptionsMenu(menu);
}
wo dein Suchbegriff ist menu_search
natürlich
und hier ist das searchviewredversion
(dies ist die xhdpi-Version): http://img836.imageshack.us/img836/5964/searchviewredversion.png
Die obige Lösung funktioniert nicht mit ActionBarSherlock 4.2 und ist daher nicht abwärtskompatibel zu Android 2.x. Hier ist Arbeitscode, der den SearchView-Hintergrund und den Hinweistext für ActionBarSherlock 4.2 einrichtet:
public static void styleSearchView(SearchView searchView, Context context) {
View searchPlate = searchView.findViewById(R.id.abs__search_plate);
searchPlate.setBackgroundResource(R.drawable.your_custom_drawable);
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(context.getResources().getColor(R.color.your_custom_color));
}
Ich bin es leid, das auch zu tun und benutze v7. Die Anwendung stürzte ab, als ich versuchte, das searchPlate
über die getIdentifier()
abzurufen.
View searchPlate = searchView.findViewById(Android.support.v7.appcompat.R.id.search_plate);
Ich hatte auch das gleiche Problem. Ich habe die appcompat v7-Bibliothek verwendet und einen benutzerdefinierten Stil dafür definiert. In den zeichnbaren Ordner legen Sie die Datei bottom_border.xml, die so aussieht:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item>
<shape >
<solid Android:color="@color/blue_color" />
</shape>
</item>
<item Android:bottom="0.8dp"
Android:left="0.8dp"
Android:right="0.8dp">
<shape >
<solid Android:color="@color/background_color" />
</shape>
</item>
<!-- draw another block to cut-off the left and right bars -->
<item Android:bottom="2.0dp">
<shape >
<solid Android:color="@color/main_accent" />
</shape>
</item>
</layer-list>
Im Werteverzeichnis styles_myactionbartheme.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppnewTheme" parent="Theme.AppCompat.Light">
<item name="Android:windowBackground">@color/background</item>
<item name="Android:actionBarStyle">@style/ActionBar</item>
<item name="Android:actionBarWidgetTheme">@style/ActionBarWidget</item>
</style>
<!-- Actionbar Theme -->
<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">
<item name="Android:background">@color/main_accent</item>
<!-- <item name="Android:icon">@drawable/abc_ic_ab_back_holo_light</item> -->
</style>
<style name="ActionBarWidget" parent="Theme.AppCompat.Light">
<!-- SearchView customization-->
<!-- Changing the small search icon when the view is expanded -->
<!-- <item name="searchViewSearchIcon">@drawable/ic_action_search</item> -->
<!-- Changing the cross icon to erase typed text -->
<!-- <item name="searchViewCloseIcon">@drawable/ic_action_remove</item> -->
<!-- Styling the background of the text field, i.e. blue bracket -->
<item name="searchViewTextField">@drawable/bottom_border</item>
<!-- Styling the text view that displays the typed text query -->
<item name="searchViewAutoCompleteTextView">@style/AutoCompleteTextView</item>
</style>
<style name="AutoCompleteTextView" parent="Widget.AppCompat.Light.AutoCompleteTextView">
<item name="Android:textColor">@color/text_color</item>
<!-- <item name="Android:textCursorDrawable">@null</item> -->
<!-- <item name="Android:textColorHighlight">@color/search_view_selected_text</item> -->
</style>
</resources>
Ich habe die Datei custommenu.xml für die Anzeige des Menüs definiert:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:com.example.actionbartheme="http://schemas.Android.com/apk/res-auto" >
<item Android:id="@+id/search"
Android:title="@string/search_title"
Android:icon="@drawable/search_buttonn"
com.example.actionbartheme:showAsAction="ifRoom|collapseActionView"
com.example.actionbartheme:actionViewClass="Android.support.v7.widget.SearchView"/>
Ihre Aktivität sollte ActionBarActivity anstelle von Activity erweitern.
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.custommenu, menu);
}
In der Manifestdatei:
<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppnewTheme" >
Weitere Informationen finden Sie hier:
Hier http://www.jayway.com/2014/06/02/Android-theming-the-actionbar/
Zuerst erstellen wir eine XML-Datei mit dem Namen search_widget_background.xml, die als zeichnbares Verzeichnis verwendet wird, d. H. In einem zeichnbaren Verzeichnis.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle" >
<solid Android:color="@color/red" />
</shape>
Diese Grafik wird als Hintergrund für unser Such-Widget verwendet. Ich habe die Farbe auf Rot gesetzt, weil Sie darum gebeten haben, aber Sie können sie auf jede durch das @ color-Tag definierte Farbe einstellen. Sie können es sogar mit den Attributen für Form-Tag (abgerundete Ecken, ovaler Hintergrund usw.) weiter modifizieren.
Im nächsten Schritt stellen Sie den Hintergrund unseres Such-Widgets auf diesen ein. Dies kann folgendermaßen erreicht werden:
public boolean onCreateOptionsMenu(Menu menu) {
SearchView searchView = (SearchView)menu.findItem(R.id.my_search_view).getActionView();
Drawable d = getResources().getDrawable(R.drawable.search_widget_background);
searchView.setBackground(d);
...
}
pdate
Wenn Sie AndroidX verwenden, können Sie dies folgendermaßen tun
View searchPlate = svSearch. findViewById(androidx.appcompat.R.id.search_plate);
if (searchPlate != null) {
AutoCompleteTextView searchText = searchPlate.findViewById(androidx.appcompat.R.id.search_src_text);
if (searchText != null){
searchText.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.edittext_text_size));
searchText.setMaxLines(1);
searchText.setSingleLine(true);
searchText.setTextColor(getResources().getColor(R.color.etTextColor));
searchText.setHintTextColor(getResources().getColor(R.color.etHintColor));
searchText.setBackground(null);
}
}
public boolean onCreateOptionsMenu(Menu menu) {
........
// Set the search plate color
int linlayId = getResources().getIdentifier("Android:id/search_plate", null, null);
View view = searchView.findViewById(linlayId);
Drawable drawColor = getResources().getDrawable(R.drawable.searchcolor);
view.setBackground( drawColor );
........
}
nd das ist die searchablecolor.xml-Datei
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item>
<shape >
<solid Android:color="#ffffff" />
</shape>
</item>
<!-- main color -->
<item Android:bottom="1.5dp"
Android:left="1.5dp"
Android:right="1.5dp">
<shape >
<solid Android:color="#2c4d8e" />
</shape>
</item>
<!-- draw another block to cut-off the left and right bars -->
<item Android:bottom="18.0dp">
<shape >
<solid Android:color="#2c4d8e" />
</shape>
</item>
</layer-list>
Ich habe am Ende dieses Beitrags mit Bildern erklärt, dass dies für Xamarin-Formulare gilt. Aber ich denke, Sie können es verstehen, weil es auf dem Quellcode von searchview von Android basiert
So ändern Sie das Bild der Schaltfläche zum Abbrechen der Suchleiste in Xamarin-Formularen
Wenn Sie Searchview wie folgt aufblasen "getMenuInflater (). Inflate (R.menu.search_menu, menu);". Dann können Sie diese Suchansicht über style.xml wie unten anpassen.
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="searchViewStyle">@style/SearchView.ActionBar</item>
</style>
<style name="SearchView.ActionBar" parent="Widget.AppCompat.SearchView.ActionBar">
<item name="queryBackground">@drawable/drw_search_view_bg</item>
<item name="searchHintIcon">@null</item>
<item name="submitBackground">@null</item>
<item name="closeIcon">@drawable/vd_cancel</item>
<item name="searchIcon">@drawable/vd_search</item>
</style>