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.

  • La barra de búsqueda personalizada no es transparente en Lollipop API21
  • Android - ¿Cómo se especifica el peso mediante programación para un RelativeLayout?
  • Cómo leer / escribir cadena de un archivo en Android
  • Android Studio no sabe dónde está Java
  • Ejecutar Android sin GUI (Android sin cabeza)
  • ¿Pueden las bibliotecas de Android en Gradle tener otras bibliotecas de Android como dependencias?
  • Android Studio: No se puede escribir en Preferencias compartidas en la prueba instrumentada
  • Preferencias personalizadasCategorías
  • Casos de uso adecuados para Android UserManager.isUserAGoat ()?
  • View getWidth () y getHeight () devuelven 0
  • Android - cómo cargar mapa de bits de res sin cambiar el tamaño?
  • ¿Cuándo debería getItemPosition considerar cambios en la posición de un ítem?
  • 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.