Виджет поиска Android Как скрыть кнопку закрытия в поиске по умолчанию?

Я реализовал андроид SearchView в ActionBar. Когда SearchView получает фокус, появляется кнопка закрытия [x] справа. Я взглянул на другие нативные приложения для Android, такие как Контакты и Gmail. Кнопка закрытия не отображается, когда SearchView получает фокус.

Как настроить мой SearchView таким образом?


person sunny    schedule 19.09.2014    source источник


Ответы (6)


Параметр searchView.setIconifiedByDefault(false) отключит свертывание представления поиска, а также удалит кнопку закрытия.

person Nuno Marques    schedule 30.05.2016

Я столкнулся с той же проблемой с android.support.v7.widget.SearchView и нашел решение. Во-первых, в onCreateOptionsMenu вы можете получить ссылку на SearchView, а также его кнопку закрытия:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.search, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);

    try {
        Field searchField = SearchView.class.getDeclaredField("mCloseButton");
        searchField.setAccessible(true);
        mSearchCloseButton = (ImageView) searchField.get(mSearchView);
    } catch (Exception e) {
        Log.e(TAG, "Error finding close button", e);
    }
}

Теперь можно попробовать модифицировать кнопку. Сначала я попытался использовать setVisibility(View.GONE), чтобы скрыть кнопку закрытия, но это не сработало, потому что SearchView сбрасывает видимость своей кнопки закрытия, когда пользователь взаимодействует с SearchView. Итак, мое решение состояло в том, чтобы использовать прозрачный рисунок и отключить нажатие кнопки закрытия:

if (mSearchCloseButton != null) {
    mSearchCloseButton.setEnabled(false);
    mSearchCloseButton.setImageDrawable(getResources().getDrawable(R.drawable.transparent));
}

Мне тоже помогла эта статья:
http://novoda.com/blog/styling-actionbar-searchview

Однако, если честно, это довольно хакерски. Было бы чище получить исходный код SearchView из https://android.googlesource.com/platform/frameworks/support.git/+/master/v7/appcompat/src/android/support/v7/widget./SearchView.java и создайте свою собственную версию SearchView, которая скрывает/отображает кнопку закрытия.

Обновление:
Google только что анонсировала AppCompat v21, в котором улучшен стиль виджета SearchView:
http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

person Fabian Frank    schedule 21.10.2014
comment
Спасибо. Мне пришлось удалить кнопку закрытия из поиска. Сначала я попробовал с mSearchCloseButton.setVisibility(View.GONE), но это не сработало. Затем я попытался установить прозрачное изображение, как вы, и моя цель была достигнута. - person Reaz Murshed; 20.09.2015

Вы также можете использовать это, чтобы скрыть кнопку закрытия

ImageView closeBtn = (ImageView) searchView.findViewById(R.id.search_close_btn);
closeBtn.setEnabled(false);
closeBtn.setImageDrawable(null);
person Nicolas    schedule 24.01.2017

Вы можете получить ссылку на кнопку из объекта SearchView (AppCompat v23.2.1):

searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
ImageView mCloseButton = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);

Затем вы можете назначить прослушиватель для изменений текста SearchView (SearchView также изменяет видимость кнопки, но прослушиватель будет выполняться впоследствии и переопределит эти изменения):

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        mCloseButton.setVisibility(newText.isEmpty() ? View.GONE : View.VISIBLE);
        return false;
    }
});

И, наконец, прослушиватель для скрытия значка, когда SearchView расширяется из состояния значков:

searchView.setOnSearchClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // hide "x" button if there is no text
        String query = searchView.getQuery().toString();
        mCloseButton.setVisibility(query.isEmpty() ? View.GONE : View.VISIBLE);
    }
});
person Roman Tikhonov    schedule 23.03.2016

Пост для будущих посетителей. Предыдущие ответы старые и непростые. Все, что вам нужно сделать, это установить null в app:closeIcon таким образом app:closeIcon="@null"

  <androidx.appcompat.widget.SearchView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:closeIcon="@null"   <!-- This simple solution -->
    app:iconifiedByDefault="false" />
person Taseer    schedule 08.05.2019

С AndroidX android.support.v7.appcompat.R.id.search_close_btn не работает

Это поможет,

app:closeIcon="@null"
person Aziz    schedule 28.09.2019