¿Cómo puedo obtener OnBackPressed () mientras SearchView está activado?
¿Cómo puedo manejar onBackPressed()
en el modo de búsqueda? He implementado la búsqueda en el ActionBar
, y quiero manejar onBackPressed()
.
Editar:
En MainActivity
he añadido esto, pero sólo se notifica cuando la búsqueda se cierra
- Android SearchView con otros elementos de ActionBar
- Android hacer desaparecer la vista haciendo clic fuera de ella
- Establecer gravedad de una vista mediante programación
- Android: SearchView no abre Actividad
- Tratamiento de mapas de bits grandes (mosaico de un pequeño mapa de bits para crear papel tapiz)
@Override public void onBackPressed() { mMenu.findItem(R.id.menu_eye).setVisible(true); mMenu.findItem(R.id.menu_layers).setVisible(true); super.onBackPressed(); };
Y mi oyente para la acción de búsqueda se parece a esto:
import com.cyrilmottier.polaris.PolarisMapView; import android.app.SearchManager.OnCancelListener; import android.content.Context; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.SearchView; public class SearchListener implements SearchView.OnQueryTextListener, SearchView.OnCloseListener, SearchView.OnSuggestionListener, OnClickListener, OnCancelListener{ private Context mContext; private PolarisMapView mMapView; private Menu mMenu; private SearchView mSearchView; public SearchListener(Context c, PolarisMapView mMapView, Menu mMenu, SearchView mSearchView){ this.setmContext(c); this.setmMapView(mMapView); this.setmMenu(mMenu); this.mSearchView = mSearchView; } @Override public boolean onQueryTextChange(String newText) { return false; } @Override public boolean onQueryTextSubmit(String query) { if (Constants.searchPlaceNavigate(query, mContext, mMapView)) return this.onClose(); return false; } public Context getmContext() { return mContext; } public void setmContext(Context mContext) { this.mContext = mContext; } public PolarisMapView getmMapView() { return mMapView; } public void setmMapView(PolarisMapView mMapView) { this.mMapView = mMapView; } @Override public boolean onSuggestionClick(int position) { String p = mSearchView.getSuggestionsAdapter().getCursor().getString(position); if(position== 0) p = mSearchView.getSuggestionsAdapter().getCursor().getString(position*4+1); if(p != null) if(position== 0) Constants.searchPlaceNavigate(mSearchView.getSuggestionsAdapter().getCursor().getString(position*4+1), mContext, mMapView); else Constants.searchPlaceNavigate(mSearchView.getSuggestionsAdapter().getCursor().getString(position), mContext, mMapView); return this.onClose(); } @Override public boolean onSuggestionSelect(int position) { return false; } @Override public boolean onClose() { mMenu.findItem(R.id.menu_eye).setVisible(true); mMenu.findItem(R.id.menu_layers).setVisible(true); mMenu.findItem(R.id.menu_search).collapseActionView(); return true; } public Menu getmMenu() { return mMenu; } public void setmMenu(Menu mMenu) { this.mMenu = mMenu; } public SearchView getmSearchView() { return mSearchView; } public void setmSearchView(SearchView mSearchView) { this.mSearchView = mSearchView; } @Override public void onClick(View v) { this.onClose(); } @Override public void onCancel() { this.onClose(); } }
- Cómo utilizar RenderScript con SurfaceView / View
- Cambiar el tamaño del texto del elemento en la vista de navegación
- Android: cómo determinar la última letra totalmente visible en TextView?
- Android superponer una vista ontop de todo?
- Obtener una vista WIDTH con match_parent propiedad?
- Android: ¿Cómo crear una vista personalizada modal?
- No se puede resolver el símbolo 'NavigationView'
- Actividad de búsqueda que no se está iniciando al pulsar Intro
Otra manera es escuchar en el MenuItem para el ActionExpand / Collapse:
MenuItem searchMenuItem = menu.findItem(R.id.menu_search); searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do whatever you need return true; // KEEP IT TO TRUE OR IT DOESN'T OPEN !! } @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do whatever you need return true; // OR FALSE IF YOU DIDN'T WANT IT TO CLOSE! } }); SearchView searchView = (SearchView) searchMenuItem.getActionView(); ... // Keep doing as you do
Pienso que esta manera es más limpia, como usted escucha directamente en lo que usted quiere
Gracias a este hilo
Para el soporte de dispositivos antiguos, se puede utilizar el siguiente código:
MenuItemCompat.setOnActionExpandListener(searchItem,new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { //Do whatever you want return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { //Do whatever you want return true; } });
Puede ampliar SearchView y reemplazar dispatchKeyEventPreIme:
Public class CustomSearchView extiende SearchView { Public CustomSearchView (contexto de contexto final) { Super (contexto); This.setIconifiedByDefault (true); } @Anular Public boolean dispatchKeyEventPreIme (evento KeyEvent) { If (event.getKeyCode () == KeyEvent.KEYCODE_BACK && Event.getAction () == KeyEvent.ACTION_UP) { This.onActionViewCollapsed (); } Return super.dispatchKeyEventPreIme (event); } }
Siempre puede ampliar las vistas y anular los métodos de escucha de la siguiente manera:
class MySearchView extends SearchView { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); //don't forget call this } }
Encontré la respuesta, la clave para ello fueron las respuestas anteriores de Mr. Ali Imran y de neworld tengo que Anular este método:
@Override public void onActionViewCollapsed() { //do somethink super.onActionViewCollapsed(); }
Se llama cada vez que searchView está cerrado, por lo que puede manejar el caso backbutton a.
Misma respuesta que hacer una vista de búsqueda personalizada, pero con el oyente
public class SearchViewer extends SearchView { private OnBackPressListener onBackPressListener; private boolean isKeyboardVisible; public SearchViewer(Context context) { super(context); } public SearchViewer(Context context, AttributeSet attrs) { super(context, attrs); } public SearchViewer(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { KeyboardUtils.addKeyboardToggleListener((Activity) getContext(), new KeyboardUtils.SoftKeyboardToggleListener() { @Override public void onToggleSoftKeyboard(boolean isVisible) { SearchViewer.this.isKeyboardVisible = isVisible; } }); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); init(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); KeyboardUtils.removeAllKeyboardToggleListeners(); } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (onBackPressListener != null && !isKeyboardVisible) onBackPressListener.backPress(); } return super.dispatchKeyEventPreIme(event); } public OnBackPressListener getOnBackPressListener() { return onBackPressListener; } public void setOnBackPressListener(OnBackPressListener onBackPressListener) { this.onBackPressListener = onBackPressListener; } public interface OnBackPressListener { void backPress(); } }
Clase de utilidad para la visibilidad del teclado, por lo que si el teclado visible atrás Presione ocultará no cerrar la actividad
public class KeyboardUtils implements ViewTreeObserver.OnGlobalLayoutListener { private static HashMap<SoftKeyboardToggleListener, KeyboardUtils> sListenerMap = new HashMap<>(); private SoftKeyboardToggleListener mCallback; private View mRootView; private float mScreenDensity = 1; private KeyboardUtils(Activity act, SoftKeyboardToggleListener listener) { mCallback = listener; mRootView = ((ViewGroup) act.findViewById(android.R.id.content)).getChildAt(0); mRootView.getViewTreeObserver().addOnGlobalLayoutListener(this); mScreenDensity = act.getResources().getDisplayMetrics().density; } public static void addKeyboardToggleListener(Activity act, SoftKeyboardToggleListener listener) { removeKeyboardToggleListener(listener); sListenerMap.put(listener, new KeyboardUtils(act, listener)); } public static void removeKeyboardToggleListener(SoftKeyboardToggleListener listener) { if (sListenerMap.containsKey(listener)) { KeyboardUtils k = sListenerMap.get(listener); k.removeListener(); sListenerMap.remove(listener); } } public static void removeAllKeyboardToggleListeners() { for (SoftKeyboardToggleListener l : sListenerMap.keySet()) sListenerMap.get(l).removeListener(); sListenerMap.clear(); } @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. mRootView.getWindowVisibleDisplayFrame(r); int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top); float dp = heightDiff / mScreenDensity; if (mCallback != null) mCallback.onToggleSoftKeyboard(dp > 200); } private void removeListener() { mCallback = null; mRootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } public interface SoftKeyboardToggleListener { void onToggleSoftKeyboard(boolean isVisible); } }
Código de muestra:
searchView.setOnBackPressListener(new SearchViewer.OnBackPressListener() { @Override public void backPress() { onBackPressed(); } });
Anular este método puede ayudarle
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); }
- Obj Fragmento incorrecto 2º tipo de argumento encontrado 'Android.support.V4.app.Fragment.' Requerido 'Android.app.Fragment'
- OpenGLES en Android – IllegalStateException: setRenderer ya ha sido llamado para esta instancia