android android-actionbar actionbarsherlock

android - Cómo reconocer si se hace clic en el botón Hecho en ActionMode



android-actionbar actionbarsherlock (3)

Uso ActionMode para seleccionar elementos en una grilla. El problema es que no puedo reconocer si se hace clic exactamente en el botón Hecho . Lo único que puedo hacer es saber que ActionMode ha terminado. Pero al presionar Back también termina el ActionMode . El comportamiento deseado es aceptar la selección en el clic Hecho , y salir del ActionMode de ActionMode al pulsar Atrás .

Traté de usar ActionMode.setCustomView() pero no afecta el botón Hecho . No se llama a Activity.onBackPressed() cuando se inicia ActionMode.

La única solución que he encontrado es usar ActionBarSherlock y obtener el botón Hecho manualmente:

View closeButton = findViewById(R.id.abs__action_mode_close_button);

Pero solo funciona en Android 2.x-3.x, porque en 4.xa se usa la barra de acción nativa.


Aquí está la solución:

ActionMode mMode = MyActivityClass.this.startActionMode(some implementation); int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android"); View doneButton = MyActivityClass.this.findViewById(doneButtonId); doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do whatever you want // in android source code it''s calling mMode.finish(); } });


Aquí está mi implementación, y es un truco correcto pero funciona y realmente no puedo encontrar una alternativa para hacer algo específico cuando se hace clic en el Modo de Acción HECHO. Me parece realmente extraño que no puedas capturar este evento de forma más elegante.

Cualquier sugerencia para hacer esto un poco menos feo sería muy apreciada ...

En mi actividad ...

boolean mActionModeIsActive = false; boolean mBackWasPressedInActionMode = false; @Override public boolean dispatchKeyEvent(KeyEvent event) { mBackWasPressedInActionMode = mActionModeIsActive && event.getKeyCode() == KeyEvent.KEYCODE_BACK; return super.dispatchKeyEvent(event); } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mActionModeIsActive = true; return true; } @Override public void onDestroyActionMode(ActionMode mode) { mActionModeIsActive = false; if (!mBackWasPressedInActionMode) onActionModeDoneClick(); mBackWasPressedInActionMode = false; } public void onActionModeDoneClick(); { // Do something here. }

Si está utilizando Fragmentos con su Actividad, entonces es probable que parte de este código deba estar en el Fragmento y los otros bits en la Actividad.

@JakeWharton (y otros usuarios de ActionBarSherlock) si ves esto en tus viajes. Me interesaría saber si lo anterior es compatible con ABS ya que aún tengo que integrar ABS con mi proyecto actual.


No lo haga, ya que es específico de la implementación y extremadamente no estándar.

Puede utilizar la devolución de llamada onDestroyActionMode para cuando se descarta un modo de acción.