El reemplazo de fragmentos activa onQueryTextChange en la vista de búsqueda

Así es como navego por mi aplicación:

  • Abrir fragmento con lista
  • Filtrar la lista por un texto introducido en searchview
  • Toque en listitem (el fragmento de lista se reemplaza por el fragmento de detalle)
  • Navegar hacia atrás (el fragmento de detalle se reemplaza por el fragmento de lista)

Cuando navego entre la lista y el fragmento de detalle, quiero mantener el filtro actual de la vista de búsqueda en una variable de cadena. Guardo el valor de la vista de búsqueda cuando se ejecuta onQueryTextChange.

El problema: No puedo almacenar el valor de filtro real porque onQueryTextChange se llama cuando navego de lista a detalle porque algo borró el texto de la vista de búsqueda.

// ... searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return false; } @Override public boolean onQueryTextChange(String s) { searchReceived(s); return true; } }); // ... public void searchReceived(String searchQuery) { this.stateHolder.searchQuery = searchQuery; // more code... } 

Cuando quiero restaurar el filtro al navegar hacia atrás, sólo filtra con una cadena vacía porque el valor equivocado se almacenó en this.stateHolder.searchQuery .

Apilar:

 onQueryTextChange():139, EmployeeListFragment$1 {com.example.exampleapp.fragment} onTextChanged():1153, SearchView {android.widget} access$2000():92, SearchView {android.widget} onTextChanged():1638, SearchView$11 {android.widget} sendOnTextChanged():7408, TextView {android.widget} setText():3816, TextView {android.widget} setText():3671, TextView {android.widget} setText():80, EditText {android.widget} setText():3646, TextView {android.widget} setQuery():511, SearchView {android.widget} onActionViewCollapsed():1250, SearchView {android.widget} collapseItemActionView():1662, ActionBarView$ExpandedActionViewMenuPresenter {com.android.internal.widget} collapseItemActionView():1258, MenuBuilder {com.android.internal.view.menu} clear():521, MenuBuilder {com.android.internal.view.menu} doInvalidatePanelMenu():789, PhoneWindow {com.android.internal.policy.impl} run():221, PhoneWindow$1 {com.android.internal.policy.impl} 

¿Cómo puedo evitar que el sistema compruebe la vista de búsqueda al navegar?

Gracias.

Después de 2 días de Googling tengo la solución que definitivamente le ayudará.

Acabo de cut and pasted código de onCreateOptionMenu() a onPrepareOptionMenu()

No sé por qué sucede, creo que el oyente de searchView no va a ser NULL por la forma en que puede cambiar su código de esta manera.

 @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); getSherlockActivity().getSupportMenuInflater().inflate(R.menu.menu_all_order, menu); searchView = (SearchView) menu.findItem(R.id.menu_all_order_search).getActionView(); searchView.setInputType(InputType.TYPE_CLASS_NUMBER); searchView.setQueryHint("Enter Order No"); searchView.setOnQueryTextListener(this); } 

Y quitar:

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

Gracias 🙂

Veo que no encontró una solución aún, tengo el mismo problema publicado aquí :

He encontrado que cuando invalidateOptionsMenu se llama también el método onQueryTextChange se llama porque el View launch dispatchRestoreInstanceState con el valor anterior después de que haya borrado la búsqueda por ejemplo. ¿Usted llama invalidateOptionsMenu quizá?

Tal vez, dentro de onQueryTextChange , puede comprobar un booleano en algún estado actual de los objetos de aplicación para saber si el contenido del método debe ejecutarse. En mi caso utilizo mDrawerLayout.isDrawerOpen(..) para permitir la búsqueda.

También puede implementar el SearchView.OnQueryTextListener en cada clase que utilice, en un Fragment o en la clase Main Activity, en algún lugar de la clase podría establecer una variable de módulo booleana que se compruebe dentro de onQueryTextChange.

showAsAction atributo del elemento de menú showAsAction desde android:showAsAction="always|collapseActionView" a android:showAsAction="always" . Ahora el aspecto y el comportamiento de la vista de búsqueda ha cambiado un poco, pero el searchQuery no se borran!

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/actionSearch" android:icon="@android:drawable/ic_menu_search" android:actionViewClass="android.widget.SearchView" android:showAsAction="always" android:title="@android:string/search_go" /> </menu> 
  • Android ActionBar Personalizar Buscar Ver
  • Barra de Acción Sherlock SearchView no se expande al hacer clic
  • Configuaration Searchable que devuelve Null para el SearchView
  • No se puede ocultar el teclado virtual de SearchView iconfiedbydefault (false)
  • Android: no puede encontrar TextView dentro de SearchWidget cuando usa la biblioteca de soporte técnico de Android
  • Gire AutoCompleteTextView en un SearchView en ActionBar en su lugar
  • Cómo manejar el botón Atrás de la vista de búsqueda en android
  • Problemas de procesamiento No se pudo resolver resource @ id / search_edit_frame
  • Restablecer barra de acciones después de usar SearchView
  • Quitar icono de la vista de búsqueda del texto de la pista
  • SearchView en OptionsMenu no es el ancho completo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.