studio how example ejemplo bar actionbar android searchview

android - how - ¿Cómo capturo el botón claro de SearchView?



searchview android how to use (7)

¿Cómo puedo capturar el evento del usuario? Haga clic en el texto claro de SearchView haciendo clic en el botón X de la derecha.

Ya capturé el onQueryTextChange , pero esto es para cualquier cambio de texto, no para ese botón X.


Después de probar muchas combinaciones, encontré cómo capturar el evento detrás del botón X en SearchView

A continuación se muestra un fragmento de código de la función onCreateOptionsMenu en una de mis aplicaciones. mSearchMenu y mSearchView son variables globales. La X es en realidad una ImageView con ID search_close_btn y el área de texto es una vista EditText con ID 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); }


Si usa la biblioteca de Appcompat, en lugar de usar

getResources().getIdentifier("android:id/search_close_btn", null, null);

Puedes hacerlo:

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


Tuve problemas para tratar de encontrar el componente por su ID, pero encontré otra forma de buscar este componente utilizando el contexto del mismo 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. } });


Una respuesta kotlin:

mySearchView.setOnCloseListener(object : SearchView.OnCloseListener { override fun onClose(): Boolean { // Do your stuff return false } })


Utilizo este código para capturar el aclarado de consultas de texto y realizar mis acciones

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


solo puede usar el 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; } });


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

Utilice R.id.search_go_btn para el botón "Enviar"