Значок закрытия режима поиска отображается отключенным, а не белым

Каждый раз, когда я набираю текст в окне поиска, кнопка закрытия (X) по какой-то причине оказывается отключенной, а не отображается белым цветом. Как исправить эту ошибку, чтобы она выглядела белой?

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_search_list, menu);
    MenuItem item = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
    searchView.setOnQueryTextListener(this);
    searchView.setQueryHint(getResources().getString(R.string.station_search_hint));
}

menu_search_list.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search_light"
        android:title="@string/action_search"
        android:orderInCategory="100"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

person SD826E    schedule 27.06.2015    source источник


Ответы (4)


Ваш код в порядке. Попробуйте следующий код:

final MenuItem search = menu.findItem(R.id.action_search);
    if (search != null) {
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
        search.expandActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                // Your Logic
                return false;
            }
        });
        MenuItemCompat.setOnActionExpandListener(search, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                return false;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                finish();
                return true;
            }
        });

Еще одна хитрость: попробуйте тот же код, приведенный выше, в onPrepareOptionsMenu со следующими дополнительными строками вверху

menu.clear();
getMenuInflater().inflate(R.menu.menu_search_list, menu);
...
// Above code
person Akshay Chordiya    schedule 08.07.2015

Чистый раствор, скрывающий значок закрытия, когда он пуст.

Используйте "collapseActionView | always" в атрибуте app: showAsAction.

<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_search"
    android:title="@string/menu_action_search"
    app:showAsAction="collapseActionView|always"
    app:actionViewClass="android.support.v7.widget.SearchView"/>
person Victor Tellez    schedule 27.09.2017

ImageView close_button = (ImageView)searchView.findViewById(R.id.close_button);
close_button .setBackgroundResource(R.drawable.your_icon);

или (с помощью селектора)

 ImageView close_button =(ImageView)searchView.findViewById(R.id.close_button);
 close_button .setBackgroundResource(R.drawable.your_image_selector);   
person Bhaskar Kumar Singh    schedule 08.07.2015
comment
Вы знаете, как решить эту проблему с помощью правильного ответа и кода? Быстрая прокрутка предварительный просмотр большого пальца с большими буквами не отображается - person SD826E; 10.07.2015
comment
Можно ли установить место, отведенное для кнопки закрытия? Я использовал приведенный выше код, он работает нормально, но новое изображение, которое я установил, выровнено почти по центру поля поиска. - person Nimmagadda Gowtham; 29.11.2015

Я думаю, скопируйте и вставьте следующий код:

View close = searchView.findViewById(R.id.search_close_btn);
close.setBackgroundResource(R.drawable.desired_icon);

Не лучшее решение. Пожалуйста, используйте для этого стили.
Первое решение. Добавьте значок закрытия по умолчанию android:searchViewCloseIcon в основную тему:

<style name="Theme" parent="AppBaseTheme">
<item name="android:searchViewCloseIcon">@drawable/ic_your_search_close_icon</item>
</style>

Второе решение (лучше). Создайте стиль панели действий

<style name="CustomActionBarTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/MyActionBar</item>
        <!-- Support library compatibility -->
        <item name="actionBarStyle">@style/MyActionBar</item>
    </style>

<!-- ActionBar styles -->
    <style name="MyActionBar"
           parent="@style/Theme.AppCompat.Light.DarkActionBar">
        <item name="searchViewCloseIcon">@android:drawable/ic_your_search_close_icon</item>
    </style>

Другие атрибуты SearchView (из appcompat- исходный код v7 (ОБНОВЛЕННАЯ ССЫЛКА)):

<attr name="searchResultListItemHeight" format="dimension" />
<attr name="searchViewAutoCompleteTextView" format="reference" />
<attr name="searchViewCloseIcon" format="reference" />
<attr name="searchViewEditQuery" format="reference" />
<attr name="searchViewEditQueryBackground" format="reference" />
<attr name="searchViewGoIcon" format="reference" />
<attr name="searchViewSearchIcon" format="reference" />
<attr name="searchViewTextField" format="reference" />
<attr name="searchViewTextFieldRight" format="reference" />
<attr name="searchViewVoiceIcon" format="reference" />

Exaple использование:

<item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
<item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
<item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
<item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
<item name="searchViewSearchIcon">@android:drawable/ic_search</item>
<item name="searchViewGoIcon">@android:drawable/ic_go</item>
<item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
<item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
<item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
<item name="searchDialogTheme">@style/Theme.SearchBar</item>

Подробнее о стилях:
Android - Theming ActionBar и SearchView в нем Андреаса Нильссона
Стилизация панели действий по официальной документации Android

person Aleksandr    schedule 08.07.2015
comment
@MacaronLover, попробуйте удалить префикс android:. Оставьте только searchViewCloseIcon - person Aleksandr; 08.07.2015
comment
Теперь я получаю эту ошибку: Cannot resolve symbol 'android:searchViewCloseIcon'. Как мне решить эту проблему? - person SD826E; 08.07.2015
comment
Ваш styles.xml: <style name="SearchViewStyle" parent="Widget.AppCompat.SearchView"> <item name="searchViewCloseIcon">@drawable/ic_up</item> </style> В вашей основной теме: <style name="Theme" parent="FrameworkRoot.Theme"> <item name="android:searchViewStyle">@style/SearchViewStyle</item> </style> - person Aleksandr; 08.07.2015
comment
Ошибка исчезла, но нужно ли ее также записывать в styles.xml? <attr name="searchViewCloseIcon" format="reference" /> - person SD826E; 08.07.2015
comment
Конечно, это должно быть в styles.xml, а не в attrs.xml - person Aleksandr; 08.07.2015
comment
Не используйте префикс android:, и тогда все будет работать. См. Второе решение, стиль MyActionBar - person Aleksandr; 08.07.2015
comment
@MacaronLover, Список атрибутов, которые я добавил, чтобы помочь вам увидеть все атрибуты. Вам не нужно добавлять его в свой код. Вам нужно только редактировать стили - person Aleksandr; 08.07.2015
comment
После использования этого кода он говорит, что требуется минимум 21 SDK. Неужели надо менять на 21? У меня сейчас 14. Не забывайте, что действие, в котором будет находиться мой поисковый просмотр, НЕ является основным действием: <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat"> <!-- Customize your theme here. --> <item name="android:searchViewStyle">@style/SearchViewStyle</item> </style> - person SD826E; 08.07.2015
comment
Это одно из решений. Менять minSdk на 21 не нужно. Я даю 3 варианта, как это реализовать. Я рекомендую вам использовать второе решение, если вам нужна поддержка Android 4+. Просто скопируйте и вставьте мое второе решение. Пожалуйста, не забудьте применить CustomActionBarTheme к панели действий в основной теме, например: ‹style name = Theme parent = Ваша родительская тема› ‹item name = android: actionBarStyle› @ style / CustomActionBarTheme ‹/item› ‹/ style › - person Aleksandr; 08.07.2015
comment
Конечно, вы можете использовать свой код, но хорошая практика - использовать стили для отдельного контента и логики представления. Если вы будете работать в хорошей компании, вам следует придерживаться некоторых стилей кода. И если вы будете использовать свой код для всех компонентов, это будет адом для всех, кто будет читать ваш код (и для вас тоже через некоторое время). Стили помогают сделать ваш код более чистым и читаемым. - person Aleksandr; 08.07.2015
comment
Кроме того, редактировать стиль проще, чем код. И основная причина в том, что вы не смешиваете весь код в Activity / Fragment. Вы редактировали только значок закрытия. Просто представьте, что происходит с вашей активностью / фрагментом, если вы будете использовать java-код для редактирования всех элементов пользовательского интерфейса? Длина кода будет намного больше, и это плохая практика. Ребята из Google упростили нашу жизнь, добавив стили, и я думаю, мы должны быть благодарны за это и следовать его руководствам. - person Aleksandr; 08.07.2015
comment
Хорошо, ваш ответ дает лучшее объяснение, поэтому я дам вам очки, когда получу вознаграждение. - person SD826E; 08.07.2015