El modo de acción iniciado llamando al getActivity().startActionMode(calback);
se cancela automáticamente después de presionar el botón Atrás. Es posible evitar este comportamiento? Necesito hacer otra operación después de presionar el botón Atrás en alguna situación durante el modo de acción.Impedir cancelar el modo de acción presionando el botón Atrás
Respuesta
Esto es un problema interesante. Cuando ActionMode está activo, el evento de la tecla de retroceso se consume internamente. El evento es no propagado a onBackPressed()
o onKeyUp(int keyCode, KeyEvent event)
devoluciones de llamada.
Afortunadamente, puede usar 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 podría preguntarse cuál será el comportamiento en caso de tener un submenú en el ActionMode y lo cierre con la llave. En este caso, no se llama al dispatchKeyEvent()
para que pueda usar el código de manera segura.
El código anterior funciona también 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 al dispatchKeyEvent()
. Usa el ActionMode de ActionBarSherlock para resolverlo.
Las soluciones sugeridas no me funcionaron. Así que decido crear el evento back
manualmente. Necesitaba este evento en mi fragmento, así que creé BaseFragment
que extenderían todos mis fragmentos.
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();
...
}
};
Crear su propio evento Window.Callback y la intersección antes de que se pasa 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);
}
Al destruir el modo de acción, restauración referencia al delegado anterior
@Override
public void onDestroyActionMode(ActionMode mode) {
Window.Callback originalWindowCallback = mWindowCallbackDelegate.getOriginalWindowCallback();
if (originalWindowCallback != null) {
getActivity().getWindow().setCallback(originalWindowCallback);
}}
Eres dueño delegado de la firma:
public class WindowCallbackDelegate implements Window.Callback {...}
- 1. android presionando el botón Atrás debe salir de la aplicación
- 2. Impedir que el botón Atrás cierre un cuadro de diálogo
- 3. Impedir que el botón Atrás cierre mi aplicación
- 4. Interceptar el botón Atrás
- 5. Ejecutar document.ready incluso si el usuario llegó a la página presionando el botón Atrás
- 6. Impedir que el botón Atrás muestre la alerta de confirmación POST
- 7. Cómo reconocer si se hace clic en el botón Hecho en el Modo de acción
- 8. Cómo manejar el botón cancelar en JOptionPane
- 9. android: botón de volumen anulado ha afectado el botón Atrás?
- 10. Android - Simular el botón Atrás
- 11. JDialog cancelar botón
- 12. Deshabilitar el botón Atrás en el navegador
- 13. Cómo atrapar el evento del botón Atrás
- 14. El botón de navegación hacia atrás no se muestra, cómo agregar el botón Atrás a UINavigationItem
- 15. Búsqueda hacia atrás en el modo vi
- 16. modo de acción contextual
- 17. El botón Atrás de UINavigationController desaparece?
- 18. Historial de página - ¿Existe el botón Atrás?
- 19. Cómo cambiar el texto de un TextView presionando un botón
- 20. Haciendo clic en el botón cancelar showInputDialogue
- 21. UIAlertView: ¿Dónde debería estar el botón cancelar?
- 22. El botón de desbordamiento fuerza el modo de acción para finalizar
- 23. El botón Cancelar de la barra de búsqueda no funciona
- 24. Cómo asociar presionando "enter" con hacer clic en el botón?
- 25. ¿Cómo puedo simular el botón Atrás del navegador en Capibara?
- 26. Modo de acción cerrar botón color de texto
- 27. iOS cómo quitar el botón Atrás?
- 28. Personalizar el botón Atrás para UIImagePickerController?
- 29. cómo desactivar el botón Atrás en Android
- 30. iphone - UIBarButtonItem personalizado para el botón Atrás
¿Podría estar un poco más claro con lo que quiere decir con "Use ActionMarlock ActionMode para resolverlo"? –
En un dispositivo con Android 3.1, no se llama a 'dispatchKeyEvent()' si no usa ActionBarSherlock. Si lo usa, se llama (ActionBarSherlock usa la implementación personalizada de ActionBar para Android 3.x). – Tomik
Esta respuesta no funciona para mí. ¿Alguna idea sobre mi pregunta aquí? Http: //stackoverflow.com/questions/32683145/prevent-back-button-whilst-actionmode-is-active – Kuffs