studio onquerytextlistener metodo hacer example como campo busqueda buscar android searchview

metodo - Android SearchView.OnQueryTextListener OnQueryTextSubmit no se activa en una cadena de consulta vacĂ­a



searchview android example listview (12)

Estoy usando Android 4.1.2. Tengo un widget ActionBar en un ActionBar . La documentación en SearchView.OnQueryTextListener del sitio del desarrollador de Android indica que onQueryTextSubmit se onQueryTextSubmit cuando "Se llama cuando el usuario envía la consulta. Esto puede deberse a una pulsación de tecla en el teclado o al presionar un botón de envío".

Esto no sucede si la consulta de búsqueda está vacía. Necesito esto para activar una consulta vacía para borrar el filtro de búsqueda de un ListView. ¿Es esto un error o estoy haciendo algo mal?


Como otros han mencionado, este comportamiento es intencional. Me di por vencido con una solución para OnQueryChangeListener y decidí solucionarlo al implementar OnEditorActionListener en el EditText de EditText , que puede manejar el uso de R.id.search_src_text . Siempre que setImeOptions las setImeOptions de setImeOptions de setImeOptions en EditorInfo.IME_ACTION_SEARCH , puede manejar un clic en el botón de búsqueda del teclado. Ver esta respuesta SO para más detalles.


En mi caso, solo quería permitir que el usuario borre su consulta, ya que se utilizó como palabra clave en la búsqueda de API, por lo que la idea más simple fue:

searchView.setOnSearchClickListener(new View.OnClickListener() { @Override public void onClick(View v) { userQuery = ""; } });

donde userQuery es mi variable usada para buscar, etc.

Espero que ayude a alguien :)


Es un hilo viejo, pero he encontrado otra solución (código Kotlin, pero también funciona en Java):

override fun onQueryTextChange(newText: String?): Boolean { if(newText == null || newText.isEmpty()) searchView.setQuery("/u00A0", false) return true }

/u00A0 es un carácter que parece espacio, pero no lo es en lo que /u00A0 código. En otras palabras, SearchView no está vacío. La cadena vacía o " " no funcionaría, porque SearchView base utiliza el ajuste, más el usuario puede querer buscar el texto que termina o comienza con un espacio. Pero hasta donde sé, los usuarios no pueden ingresar el carácter /u00A0 .

Entonces todo lo que necesita hacer es anular getQuery para return super.getQuery.replace("/u00A0", "") en su SearchView personalizado


No es un error, el código fuente verifica deliberadamente los valores nulos y vacíos:

private void onSubmitQuery() { CharSequence query = mQueryTextView.getText(); if (query != null && TextUtils.getTrimmedLength(query) > 0) {

Sin embargo, debería poder usar la devolución de llamada de OnQueryTextChange para borrar los filtros de su ListView cuando el usuario borra la búsqueda EditText.


No puedes sobrescribir este comportamiento. Una solución alternativa podría ser borrar el filtro, cuando un usuario sale de la vista de búsqueda.

Puedes usar OnCloseListener para esto. Sin embargo, esto también puede causar problemas, dependiendo del nivel de API mínimo que esté desarrollando.


Otra opción es activar el método onQueryTextChange manualmente a través de TextWatcher:

public class MyActivity extends Activity implements SearchView.OnQueryTextListener, TextWatcher { // Basic onCreate(Bundle) here @Override public boolean onCreateOptionsMenu (final Menu menu) { getMenuInflater().inflate(R.menu.myMenu, menu); final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); final SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE); searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName())); searchView.setOnQueryTextListener(this); final int resource_edit_text = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null); ((EditText) searchView.findViewById(resource_edit_text)).addTextChangedListener(this); return super.onCreateOptionsMenu(menu); } // Implementation of TextWatcher, used to have a proper onQueryTextChange (it doesn''t update when the last character is removed) @Override public void beforeTextChanged (final CharSequence charSequence, final int start, final int count, final int after) {} @Override public void onTextChanged (final CharSequence charSequence, final int start, final int before, final int after) {} @Override public void afterTextChanged (final Editable editable) { if (editable.length() == 0) onQueryTextChange(editable.toString()); } // Implementation of OnQueryTextChangeListener @Override public boolean onQueryTextChange (final String query) { // do stuff return false; } @Override public boolean onQueryTextSubmit (final String query) { // do stuff return false; } }

Todo esto va con todos los archivos xml predeterminados que se han entregado aquí, ese no es el punto de esta respuesta. Esta es una solución que elijo usar, siéntase libre de usar a otros


Para una solución más sencilla: use onQueryTextChange, pero solo procese si está vacío.

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { renderList(true); return false; } @Override public boolean onQueryTextChange(String newText) { if (searchView.getQuery().length() == 0) { renderList(true); } return false; } });


Puedo lograrlo simplemente implementando setOnQueryTextListener de esta manera:

SearchView searchView = (SearchView) menu.findItem(R.id.searchProductView).getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { loadLocalData(newText); } return true; } });

Donde está mi método loadLocalData

//query my DB products = ProductDAO.findByIdList(idList); LinearLayoutManager layoutManager = new LinearLayoutManager(this); listView.setLayoutManager(layoutManager); listView.setAdapter(<YOURADAPTER>)

Esta solución borra su consulta incluso si borra el texto con el botón "X"


Tuve el mismo problema con SearchView. Mi solución, que consiste en diseñar SearchView como se muestra en la guía http://novoda.com/blog/styling-the-actionbar-searchview/ y configurar OnEditorActionListener para EditText ( ¿Cómo puedo activar una acción cuando el usuario pulsa Intro? ), Que es parte de la SearchView fue esta:

final SearchView searchView = (SearchView)findViewById(R.id.search); int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_src_text", null, null); EditText searchPlate = (EditText) searchView.findViewById(searchPlateId); searchPlate.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { //Do something } return false; });


Tuve el mismo problema y OnQueryTextListener.onQueryTextChange con la siguiente solución: OnQueryTextListener.onQueryTextChange + OnQueryTextListener.onQueryTextChange

SearchView personalizado:

public class MySearchView extends SearchView { private boolean expanded; public MySearchView(Context context) { super(context); } @Override public void onActionViewExpanded() { super.onActionViewExpanded(); expanded = true; } @Override public void onActionViewCollapsed() { super.onActionViewCollapsed(); expanded = false; } public boolean isExpanded() { return expanded; } }

Creando acción y configurando callback:

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); searchAction = menu.add(0, SEARCH_ACTION_ID, 0 , getString(R.string.action_search)); searchAction.setShowAsAction(SHOW_AS_ACTION_ALWAYS | SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); searchView = new MySearchView(getSherlockActivity()); searchView.setOnQueryTextListener(searchQueryListener); searchView.setIconifiedByDefault(true); searchAction.setActionView(searchView); }

Y por último el oyente:

private OnQueryTextListener searchQueryListener = new OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { search(query); return true; } @Override public boolean onQueryTextChange(String newText) { if (searchView.isExpanded() && TextUtils.isEmpty(newText)) { search(""); } return true; } public void search(String query) { // reset loader, swap cursor, etc. } };

Probado en ABS 4.3.


Tuve el mismo problema, ya que las consultas vacías no son compatibles. Tuve que descargar y usar ActionBarSherlock y luego modificar el método onSubmitQuery ().

Así es como se ve mi onSubmitQuery () ahora

private void onSubmitQuery() { CharSequence query = mQueryTextView.getText(); if (query == null) {query = "";} if (mOnQueryChangeListener == null || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) { if (mSearchable != null) { launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString()); setImeVisibility(false); } dismissSuggestions(); } }

Espero que esto ayude.


Este es un truco muy sucio , sin embargo, funciona correctamente como se esperaba, permitiendo la acción de envío incluso cuando no hay texto ingresado (o ingresado y luego editado) en SearchView.

Obtiene acceso de manera reflexiva al oyente de acción del editor de TextView interno, lo envuelve en un escucha personalizado donde delega la llamada al controlador, y finalmente lo establece como el oyente de acción del TextView interno.

Class klass = searchView.getClass(); try { Field currentListenerField = klass.getDeclaredField("mOnEditorActionListener"); currentListenerField.setAccessible(true); TextView.OnEditorActionListener previousListener = (TextView.OnEditorActionListener) currentListenerField.get(searchView); TextView.OnEditorActionListener newListener = new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (v.getText().length() == 0) handleQuery(""); return previousListener.onEditorAction(v, actionId, event); } }; Field innerTextViewField = klass.getDeclaredField("mSearchSrcTextView"); innerTextViewField.setAccessible(true); SearchView.SearchAutoComplete innerTextView = (SearchView.SearchAutoComplete) innerTextViewField.get(searchView); innerTextView.setOnEditorActionListener(newListener); } catch (Exception e) { throw new IllegalStateException(e); }