Evita cancelar el modo de acción pulsando el botón de retroceso
El modo de acción comenzó llamando a getActivity().startActionMode(calback);
Se cancela automáticamente después de pulsar el botón. ¿Es posible evitar este comportamiento? Necesito hacer otra operación después de presionar el botón de retroceso en alguna situación durante el modo de acción.
- Android: quita el botón "Más acciones" del ActionBar
- Android: el margen entre el icono de ActionBar y el menú desplegable de Navegación cambia al hacer clic en Buscar
- Los elementos visibles de SearchView en ActionBar aparecen borrosos
- ¿Cómo puedo implementar la barra de acción personalizada con botones personalizados en Android?
- Personalizar Android ActionBar
- Anulación de androide: elipse en el subtítulo ActionBar
- La barra de acción de Android nunca se divide en la pantalla de 5.1 "
- Android ActionBar NullPointerException
- Sólo la mitad inferior de la barra de acciones está mostrando (y está detrás de la barra de estado)
- Styling Action Bar Color de texto - Android
- Android ActionBar - Presiona la vista personalizada hasta la parte inferior de la pantalla
- Holo Light con Dark Actionbar muestra Holo Dark copiar y pegar iconos
- Mostrar el botón de arriba / atrás en android anidado PreferenceScreen?
Este es un problema interesante. Cuando el modo de acción está activo, el evento de tecla de retorno se consume internamente. El evento no se propaga a las onBackPressed()
o onKeyUp(int keyCode, KeyEvent event)
.
Afortunadamente, puede utilizar dispatchKeyEvent(KeyEvent event)
que todavía se llama.
@Override public boolean dispatchKeyEvent(KeyEvent event) { if(mActionModeIsActive) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { // handle your back button code here return true; // consumes the back key event - ActionMode is not finished } } return super.dispatchKeyEvent(event); }
Usted puede preguntarse cuál será el comportamiento en caso de que tenga un submenú en el ActionMode y lo cierre con la tecla de regreso. En este caso, dispatchKeyEvent()
no se llama para que pueda utilizar el código con seguridad.
El código anterior también funciona con ActionBarSherlock. El único problema que encontré es en el dispositivo Android 3.1 cuando se usa el ActionMode nativo, en este caso no se llama a dispatchKeyEvent()
. Utilice el ActionMode de ActionBarSherlock para resolverlo.
Las soluciones sugeridas no funcionaron para mí. Así que decido crear el evento de back
manualmente. Necesitaba este evento en mi fragmento así que creé BaseFragment
que todos mis fragmentos se extenderán.
public abstract class BaseFragment extends Fragment { private ActionModeState actionModeState = ActionModeState.ITEM_NOT_CLICKED; protected enum ActionModeState { ITEM_NOT_CLICKED, ITEM_CLICKED } protected void onActionItemClicked() { actionModeState = ActionModeState.ITEM_CLICKED; } protected void onDestroyActionMode() { if (actionModeState == ActionModeState.ITEM_NOT_CLICKED) { onActionModeBackPressed(); } else { // reset state actionModeState = ActionModeState.ITEM_NOT_CLICKED; } } protected void onActionModeBackPressed() { } }
Fragmento principal
public class YourMainFragment extends BaseMapFragment { @Override public void onActionModeBackPressed() { // you code for action mode back button } private ActionMode.Callback actionModeCallback = new ActionMode.Callback() { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { YourMainFragment.this.onActionItemClicked(); .... } @Override public void onDestroyActionMode(ActionMode mode) { YourMainFragment.this.onDestroyActionMode(); ... } };
Cree su propio evento Window.Callback e interceptar antes de pasarlo a AppCompatDelegateImplBase.
@Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //default delegate final Window window = getActivity().getWindow(); mWindowCallbackDelegate = new WindowCallbackDelegate(window.getCallback(), this); window.setCallback(mWindowCallbackDelegate); return true; }
En su propio delegado:
@Override public boolean dispatchKeyEvent(KeyEvent event) { return myWindowDelegate.dispatchKeyEvent(event) || mOriginalWindowCallback.dispatchKeyEvent(event); }
Cuando destruye el modo de acción, restaure la referencia al delegado anterior
@Override public void onDestroyActionMode(ActionMode mode) { Window.Callback originalWindowCallback = mWindowCallbackDelegate.getOriginalWindowCallback(); if (originalWindowCallback != null) { getActivity().getWindow().setCallback(originalWindowCallback); }}
Usted es dueño de la firma del delegado:
public class WindowCallbackDelegate implements Window.Callback {...}
- Obtener imagen Uri en onActivityResult después de tomar la foto?
- Una biblioteca utiliza el mismo paquete que este proyecto después de importar Facebook SDK