wake-up-neo.com

Ändern des Hintergrunds, der vom Widget für die Suchansicht gezeichnet werden kann

Ich versuche, das Drawable zu ändern, das sich im Android actionbar searchview widget befindet.

Derzeit sieht es so aus: enter image description here

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?

120
Martyn

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);
}
31
Abdul Rahman

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

enter image description here

14
VinceFR

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));
}
13
David Vávra

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);
5
Ido

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/

3
Suhas Patil

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);
...
    }
2
Erol

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);
        }
    }
1
Secret Coder
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>
1
M.Raheel

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

0
vu ledang

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>
0
E Player Plus