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.

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 {...}

  • Agregar botones a la barra de acción de Android
  • Cómo cambiar el color de la pestaña seleccionada
  • El botón Volver a la barra de acción no aparece en Android
  • ¿Cómo mostrar la casa predeterminada como indicador ascendente mediante la barra de acción de soporte?
  • Icono de la barra de acciones activado no es el título
  • ¿Cómo cambio programaticamente el color de texto de ActionBar menuitem?
  • Android eliminar icono de la aplicación barra de acción
  • Android L: ActionBar setHideOnContentScrollEnabled
  • Barra de acción de contracción pero sólo muestra cuando RecyclerView muestra completamente el primer elemento
  • ¿Cómo puedo cambiar las acciones de Action Bar de forma dinámica?
  • Eliminando la sombra inferior en ActionBar - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.