[Виджет поиска Android] Как скрыть кнопку закрытия в окне поиска по умолчанию?
Я реализовал андроид SearchView
в ActionBar
, Когда SearchView
получает фокус, появляется кнопка закрытия [x] справа. Я взглянул на другие нативные приложения для Android, такие как Контакты и Gmail. Кнопка закрытия не отображается, когда SearchView
получает фокус.
Как установить мой SearchView
вести себя так?
4 ответа
Настройка searchView.setIconifiedByDefault(false)
отключит сворачивание вида поиска, а также уберет кнопку закрытия.
Я столкнулся с той же проблемой с 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
Размещение для будущих посетителей. Предыдущие ответы старые и непростые. Все, что вам нужно сделать, это установить 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" />
Вы также можете использовать это, чтобы скрыть кнопку закрытия
ImageView closeBtn = (ImageView) searchView.findViewById(R.id.search_close_btn);
closeBtn.setEnabled(false);
closeBtn.setImageDrawable(null);
Вы можете получить ссылку на кнопку из объекта 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);
}
});
С AndroidX
, android.support.v7.appcompat.R.id.search_close_btn
не будет работать
Это поможет,
app:closeIcon="@null"