Оформяне на SearchView в лентата за действие на Android

Имам джаджа за търсене в моята лента за действия като тази:

Приспособление за търсене в лентата за действие

(1) Как да променя цвета на текста, който казва „iPhone“?

(2) Освен това, ако забележите сивия X -- целият Widget за търсене също е с този цвят, когато е в позиция на икона. Аз съм на Holo.Theme.Light и използвам мои собствени модификации към него.

Как да променя тези два стила за приспособлението в моя файл styles.xml (ако приемем, че там правите промените за притурка за търсене)?


person TheLettuceMaster    schedule 17.07.2012    source източник
comment
1. Какво означава в позиция на икона? 2. Какво наистина искате да промените в (2)? Цвят на X? Цвят на подчертаването? И двете?   -  person vArDo    schedule 26.07.2012
comment
хей това е старо и аз го реших - нещо като. Поставям отговора по-долу. Исках да сменя цвета на текста и най-вече X. В позиция на икона е просто лупа в лентата с действия. Щраквате върху него и той се отваря, както виждате по-горе.   -  person TheLettuceMaster    schedule 26.07.2012
comment
stackoverflow.com/posts/12942258/edit Това е мръсен хак, но работи   -  person Pongpat    schedule 18.10.2012
comment
@KickingLettuce, моля, кажете ми дали използвате персонализирано оформление на лентата с действия? как показвате изображението на иконата вляво?   -  person Erum    schedule 02.09.2015
comment
най-накрая!! Работи перфектно на Xamarin.Android @Pongpat Благодаря   -  person KennyAli    schedule 17.02.2021


Отговори (9)


Ще трябва да зададете

searchView.setBackgroundColor(Color.WHITE);

SearchViews не са толкова адаптивни.

person lokoko    schedule 17.12.2012
comment
Много интересно, трябва да опитате това. Реших го със заобиколно решение преди седмици... но това е много добре да се знае. гласуване за. - person TheLettuceMaster; 17.12.2012

Прекарвах много време за това, но накрая: :-)

  1. За да промените цвета на текста:
((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setTextColor(Color.WHITE);

или този за AndroidX:

((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text)).setTextColor(Color.WHITE);
  1. За да промените текстовата подсказка:
((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setHintTextColor(Color.WHITE);

или този за AndroidX:

((EditText)searchView.findViewById(androidx.appcompat.R.id.search_src_text)).setHintTextColor(Color.WHITE);
person Adidas    schedule 04.02.2014

Ако използвате библиотека appcompat, тогава решението е малко по-различно от отговора на Jerome. Ето моето решение

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.main_menu, menu);
    restoreActionBar();

    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.clear_search);

    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);
}
person Abdul Rahman    schedule 22.01.2014
comment
Ние сме мързеливи и не обичаме да следваме връзки. Моля, включете решението в отговора си, а не само връзка. - person mhlester; 22.01.2014
comment
Повечето от това идва от файла abc_search_view.xml в appcompat. Надявам се някой да глоби това полезно. - person LEO; 22.05.2014
comment
Точно от каквото имах нужда. - person theblang; 04.08.2014
comment
Къде всъщност можете да промените search_mag_icon? Мога да променя всичко, освен това. - person theblang; 14.08.2014

Можете да промените стила на изгледа за търсене. Ето някакъв код, който използвах, за да променя текста за редактиране, иконата на гласа...

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);

        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
        searchView.findViewById(searchPlateId).setBackgroundResource(R.drawable.textfield_search_selected);

        int voiceSearchPlateId = searchView.getContext().getResources().getIdentifier("android:id/submit_area", null, null);
        searchView.findViewById(voiceSearchPlateId).setBackgroundResource(R.drawable.textfield_search_right_selected);

        // change hint color
        int searchTextViewId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView searchTextView = (TextView) searchView.findViewById(searchTextViewId);
        searchTextView.setHintTextColor(getResources().getColor(R.color.light_grey));

[редактиране] По-пълен отговор е достъпен тук: Промяна изчертаването на фона на приспособлението searchview

person Jerome VDL    schedule 24.06.2013
comment
Как мога да намеря тези идентификатори? Искам да променя иконата на лупа и x на тъмен цвят. - person Vituel; 03.01.2014
comment
+1. Това ми помогна. Но вместо да използвате getIdentifier, можете просто да използвате ids в случай на ABS. searchView.findViewById(R.id.abs__search_plate).setBackgroundResource(R.drawable.myBackground); По подобен начин можете да използвате за област за изпращане и търсене на src текст - person Rahul Sainani; 18.04.2014

От Lollipop можете да стилизирате изгледа за търсене като този от публикация в блог http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

values/themes.xml:
<style name=”Theme.MyTheme” parent=”Theme.AppCompat”>
    <item name=”searchViewStyle”>@style/MySearchViewStyle</item>
</style>
<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
    <!-- Background for the search query section (e.g. EditText) -->
    <item name="queryBackground">...</item>
    <!-- Background for the actions section (e.g. voice, submit) -->
    <item name="submitBackground">...</item>
    <!-- Close button icon -->
    <item name="closeIcon">...</item>
    <!-- Search button icon -->
    <item name="searchIcon">...</item>
    <!-- Go/commit button icon -->
    <item name="goIcon">...</item>
    <!-- Voice search button icon -->
    <item name="voiceIcon">...</item>
    <!-- Commit icon shown in the query suggestion row -->
    <item name="commitIcon">...</item>
    <!-- Layout for query suggestion rows -->
    <item name="suggestionRowLayout">...</item>
</style>
person QAMAR    schedule 15.09.2015
comment
Има ли начин да използвате стила за изглед за търсене преди близалка? Например като KitKat? - person Red M; 04.08.2016
comment
Това е AppCompat - наистина за устройства преди Lollipop. - person Przemo; 22.07.2020

Начинът, по който реших това, беше с помощта на темата Holo.Light.DarkActionBar. Не вярвам, че можете лесно да промените джаджата за търсене по друг начин.

person TheLettuceMaster    schedule 26.07.2012
comment
Всъщност можете да зададете цвят на текста EditText в SearchView. Въпреки това, както споменахте, не е толкова лесно, колкото използването на XML стилови дефиниции. Можете дори да зададете цвят на подчертаването. Вижте моя отговор на други относно SearchView персонализирането. - person vArDo; 26.07.2012
comment
Това е най-добрият начин да направите това според мен. - person Clive Jefferies; 30.06.2014

Ако искате бял текст, трябва да се разширите от тема на лентата за действие, която има черен фон като Holo.Theme или Theme.AppCompat.Light.DarkActionBar, ако използвате библиотеката за поддръжка.
Не са необходими други настройки.

person Mehdiway    schedule 14.05.2014

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        // Associate search configuration with the SearchView
        SearchManager searchManager =
               (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setQueryHint("Client/DOB/PPSN");
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));

        // Setting the textview default behaviour properties
        int id = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) searchView.findViewById(id);
        textView.setTextColor(Color.WHITE);
        textView.setHintTextColor(Color.WHITE);

        // Set the search plate color to white
        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 );
        return super.onCreateOptionsMenu(menu);

    }

Сега това е xml файлът searchcolor.xml за промяна на цвета на табелата на лентата за търсене

<?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="10.0dp">
      <shape >
          <solid android:color="#2c4d8e" />
      </shape>
  </item>
</layer-list>

и menu/menu.xml за създаване на търсене в лентата с действия

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/search"
          android:icon="@drawable/search"
          android:showAsAction="ifRoom"
          android:actionViewClass="android.widget.SearchView" />

</menu>
person M.Raheel    schedule 30.12.2014

Вземете SearchView във вашия файл xxxActivity.java и след това:

SearchView searchView = (SearchView)menu.findItem(R.id.my_search_view).getActionView();
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);

// Getting the 'search_plate' LinearLayout.
View searchPlate = searchView.findViewById(searchPlateId);
searchPlate.setBackgroundResource(R.drawable.textfield_searchview);

Създаване на файл res/drawable/texfield_searchview.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"
        android:drawable="@drawable/textfield_search_selected_holo_light" />
    <item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>
person Jas    schedule 09.12.2015