android android-actionbar actionbarsherlock searchview

android - searchview no se cierra correctamente en FIRST back press(solo está perdiendo el foco)



android-actionbar actionbarsherlock (8)

Tengo que presionar el botón back dos veces para cerrar el SearchView . ¿Por qué? En la primera pulsación, SearchView solo pierde el foco ...

Establecer setOnKeyListener en setOnKeyListener tampoco funciona ...

Por cierto, estoy usando la implementación de ABS ...

Mi código es simple y se ve así:

mMenuItemSearch = menu.findItem(R.id.search); mSearchView = new SearchView(getSupportActionBar().getThemedContext()); mMenuItemSearch.setActionView(mSearchView); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(String newText) { mPagerManager.getFragment(mSelectedPos).adapter.getFilter().filter(newText); return true; } public boolean onQueryTextSubmit(String query) { return true; } });


La vista de búsqueda que se cierra hacia atrás es el comportamiento esperado y a lo que nos hemos acostumbrado. Podría anularlo si desea ampliar su propio SearchView y / o escuchar un onBackPressed () para finalizar su actividad en la que vive el SearchView.


Puede llamar a view.requestFocus() para dar enfoque a otra vista. De esta forma, la vista de búsqueda se cerrará con una pulsación atrás.


Lo solucioné de esta manera:

... public class MyFragment extends Fragment implemented SearchView.OnFocusChangeListener <---- ... @Override public void onFocusChange(View v, boolean hasFocus) { MenuItem menuItem = menu.findItem(R.id.action_search); SearchView sv = (SearchView)MenuItemCompat.getActionView(menuItem); if(!hasFocus) { sv.onActionViewCollapsed(); <---- interactionListener.showDrawerToggle(true); <---- } } ... public void configureSearchView(Menu menu) { this.menu = menu; MenuItem menuItem = menu.findItem(R.id.action_search); SearchView sv = (SearchView)MenuItemCompat.getActionView(menuItem); sv.setOnSearchClickListener(new View.OnClickListener() { @Override public void onClick(View v) { interactionListener.showDrawerToggle(false); } }); sv.setOnQueryTextListener(this); sv.setOnCloseListener(this); sv.setSubmitButtonEnabled(false); sv.setIconifiedByDefault(true); sv.setOnQueryTextFocusChangeListener(this); <---- if(initialQuery != null) { sv.setIconified(false); menuItem.expandActionView(); sv.setQuery(initialQuery, true); } } ...


intente esto en su método de configureSearchView (), me funciona.

mSearchView.post(new Runnable() { @Override public void run() { mSearchView.setIconified(false); } });


Después de probar mucho, encontré la solución.

En onQueryTextSubmit(String query) escribe searchView.clearFocus();

Luego, en onBackPressed() use el siguiente código:

if (!searchView.isIconified()) { searchView.setIconified(true); searchView.onActionViewCollapsed(); } else { super.onBackPressed(); }


La única forma de corregir esto es usar android.support.v7.widget.SearchView lugar de android.widget.SearchView

Lo solucioné haciendo esto.


Tendría que ampliar SearchView y reemplazar el dispatchKeyEventPreIme

public class SearchView extends android.support.v7.widget.SearchView { public SearchView(Context context) { super(context); } public SearchView(Context context, AttributeSet attrs) { super(context, attrs); } public SearchView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { onActionViewCollapsed(); } } return super.dispatchKeyEventPreIme(event); } }


onBackPressed solo debe borrar el foco de la vista de búsqueda (SearchAutoComplete) EditText, es un comportamiento normal.

Pero si quieres cambiar este comportamiento, hazlo (:

final SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); final MenuItem searchViewItem = menu.findItem(R.id.searchView); searchAutoComplete.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!searchAutoComplete.isFocused()){ searchViewItem.collapseActionView(); searchView.onActionViewCollapsed(); viewManager.dismissSearchDropDownPopupWindow(); } } });