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.
- Pasar la consulta de búsqueda ActionBar para fragmentar
- Eliminar el relleno de Android SearchView cuando se amplía
- Android - vista de búsqueda con función completa automática dentro de la barra de acción
- Android ActionBar: plegable SearchView con botón de acción
- ¿Hay algún oyente en Android SearchView para notificar si SearchView está expandido y listo para tomar entrada?
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.
- Mejores Prácticas para el Manejo de la Búsqueda
- Barra de Acción de Android SearchView Menu Icon Size
- El botón de la barra de acciones no se muestra en la vista de búsqueda de Android
- Cuándo cerrar Cursor utilizado en SimpleCursorAdapter
- Android - Actionbar Sherlock - Filtro de búsqueda
- Cómo descartar / cerrar / contraer SearchView en ActionBar en MainActivity?
- NullPointerException en SearchView con AppCompat en Android 5.0
- SearchView con múltiples fragmentos usando viewpager en android
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>
- Cómo liberar la memoria del mapa de bits utilizando imageloader en android?
- Android Set ImageView image src en estilo