Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • ¿Cómo declaro una barra de herramientas / barra de acción de altura extendida en Android Lollipop?
  • ActionBar no se desplaza a la pestaña seleccionada si ésta está fuera de los límites visibles de actionBar en la pantalla
  • Cambiar el color de fondo de ActionBar en el código de la lista de navegación
  • Elevación de la barra de acción predeterminada
  • Eliminar el subtítulo de ActionBar / restablecer el texto de ActionBar
  • Android ActionBar - Presiona la vista personalizada hasta la parte inferior de la pantalla
  • Cómo especificar el modo de acción oscura con mi tema
  • Cómo cambiar el color del título de la barra de acción en el código
  • 3 Solutions collect form web for “Evita cancelar el modo de acción pulsando el botón de retroceso”

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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.