Как я могу зафиксировать событие, когда пользователь нажимает на чистый текст SearchView
, нажав кнопку X справа
Я уже зафиксировал событие onQueryTextChange
, но это для любого изменения текста, а не для этой кнопки X
Как я могу зафиксировать событие, когда пользователь нажимает на чистый текст SearchView
, нажав кнопку X справа
Я уже зафиксировал событие onQueryTextChange
, но это для любого изменения текста, а не для этой кнопки X
Перепробовав множество комбинаций, я нашел, как зафиксировать событие за кнопкой X в SearchView.
Ниже приведен фрагмент кода из функции onCreateOptionsMenu
в одном из моих приложений. mSearchMenu
и mSearchView
— глобальные переменные. X на самом деле является ImageView с идентификатором search_close_btn
, а текстовая область представляет собой представление EditText с идентификатором search_src_text
.
@SuppressLint("NewApi")
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.country_list_activity_actions, menu);
mSearchMenu = menu.findItem(R.id.action_search);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
// Assumes current activity is the searchable activity
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
mSearchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
// Get the search close button image view
ImageView closeButton = (ImageView)mSearchView.findViewById(R.id.search_close_btn);
// Set on click listener
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoggerUtils.d(LOG, "Search close button clicked");
//Find EditText view
EditText et = (EditText) findViewById(R.id.search_src_text);
//Clear the text from EditText view
et.setText("");
//Clear query
mSearchView.setQuery("", false);
//Collapse the action view
mSearchView.onActionViewCollapsed();
//Collapse the search widget
mSearchMenu.collapseActionView();
}
});
}
// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
mSearchMenu.setOnActionExpandListener(new OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
//Nothing to do here
LoggerUtils.d(LOG, "Search widget expand ");
return true; // Return true to expand action view
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
LoggerUtils.d(LOG, "Search widget colapsed ");
return true; // Return true to collapse action view
}
});
return super.onCreateOptionsMenu(menu);
}
вы можете просто использовать onCloseListener()
sv= (SearchView) findViewById(R.id.searchView1);
sv.setOnCloseListener(new OnCloseListener() {
@Override
public boolean onClose() {
Toast t = Toast.makeText(MainActivity.this, "close", Toast.LENGTH_SHORT);
t.show();
return false;
}
});
SearchView
, но у меня не работает с iconifiedByDefault="false"
- person Richard Le Mesurier; 18.01.2016
У меня были проблемы с поиском компонента по его идентификатору, но я нашел другой способ поиска этого компонента, используя контекст того же SearchView
// Catch event on [x] button inside search view
int searchCloseButtonId = searchView.getContext().getResources()
.getIdentifier("android:id/search_close_btn", null, null);
ImageView closeButton = (ImageView) this.searchView.findViewById(searchCloseButtonId);
// Set on click listener
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Manage this event.
}
});
searchView.setIconified(true);
или searchView.setIconified(false);
соответственно
- person Gidi Sprintzin; 16.11.2016
Я использую этот код, чтобы поймать очистку текстового запроса и выполнить свои действия
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.search_button).getActionView();
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String cs) {
if (TextUtils.isEmpty(cs)){
//Text is cleared, do your thing
}
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
//text query submitted
}
};
searchView.setOnQueryTextListener(textChangeListener);
return true;
}
Если вы используете библиотеку Appcompat, вместо использования
getResources().getIdentifier("android:id/search_close_btn", null, null);
вы можете сделать это:
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
View closeButton = searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//handle click
}
});
ИЗМЕНИТЬ АВГУСТ 2019 Г.:
Если вы используете androidx: androidx.appcompat.R.id.search_close_btn
Если вы используете SearchView из androidx, вы можете сделать это:
val closeButton: View? = searchView.findViewById(androidx.appcompat.R.id.search_close_btn)
closeButton?.setOnClickListener {
//TODO: Set your action
}
searchView.setQuery("", false)
.
- person djserva; 18.02.2021
ImageView closeButton = (ImageView) this.searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn);
closeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Manage this event.
}
});
Используйте R.id.search_go_btn для кнопки «Отправить»
Котлин ответ:
mySearchView.setOnCloseListener(object : SearchView.OnCloseListener {
override fun onClose(): Boolean {
// Do your stuff
return false
}
})
Решение от Эдуардо у меня не работает. Я нашел кое-что еще, что работает для Kotlin. Я нашел это решение благодаря SjoerdvGestel и его ответу.
// Get the close button on the searchView
val closeButtonId: Int = searching.context.resources.getIdentifier("android:id/search_close_btn", null, null)
val closeButton = searching.findViewById(closeButtonId) as ImageView
// On close collapse the searchView
closeButton.setOnClickListener {
searching.onActionViewCollapsed()
true
}
Для возврата в исходное состояние SearchView можно сделать четкий фокус при нажатии X, кроме того, этот четкий фокус скрывает клавиатуру.
searchview.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
searchview.clearFocus();
return false;
}
});