Стилизация SearchView в панели действий Android

У меня есть виджет поиска в моей панели действий:

Поиск виджета в панели действий

(1) Как изменить цвет текста с надписью «iPhone»?

(2) Также, если вы заметили серый X – весь Виджет поиска – это тот же цвет, когда он находится в позиции значка. Я нахожусь на Holo.Theme.Light и использую свои моды.

Как изменить эти два стиля для виджета в файле styles.xml (если вы вносите изменения в виджет поиска)?

Solutions Collecting From Web of "Стилизация SearchView в панели действий Android"

Вам нужно будет установить

searchView.setBackgroundColor(Color.WHITE); 

SearchViews не так настраиваемы.

Я потратил много времени на это, но, наконец: 🙂

1) Чтобы изменить цвет текста:

 ((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setTextColor(Color.WHITE); 

2) Чтобы изменить подсказку текста:

 ((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setHintTextColor(Color.WHITE); 

Вы можете изменить стиль поиска. Вот какой код я использовал для настройки edittext, голосовой значок …

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

[Edit] Более полный ответ доступен здесь: изменение фона для виджета searchview

Если вы используете библиотеку appcompat, то решение немного отличается от ответа Джерома. Вот мое решение

 @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); } 

По состоянию на Lollipop вы можете стиль поиска, как это из блога post 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 (eg EditText) --> <item name="queryBackground">...</item> <!-- Background for the actions section (eg 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> 

То, как я решил это, было использование темы Holo.Light.DarkActionBar. Я не думаю, что вы можете легко изменить виджет поиска в противном случае.

В onCreateOptionsMenu :

 int id = searchView.getContext() .getResources() .getIdentifier("android:id/search_src_text", null, null); TextView textView = (TextView) searchView.findViewById(id); textView.setTextColor(Color.WHITE); 
 SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search)); searchView.setSubmitButtonEnabled(true); // to enable submit button ImageView b = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_go_btn); b.setImageResource(android.R.drawable.ic_menu_search); //to change submit button icon TextView a=(TextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); a.setTextColor(...); //to change color of search text 

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

 @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> 

Получите 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>