Cómo reconocer si se hace clic en el botón Done en ActionMode


Utilizo ActionMode para seleccionar elementos en una cuadrícula. El problema es que no puedo reconocer si se hace clic exactamente en el botón Done. Lo único que puedo es saber que ActionMode está terminado. Pero presionando Atrás termina el ActionMode también. El comportamiento deseado es aceptar la selección en Hecho clic, y salir ActionMode en Volver pulse.

Traté de usar ActionMode.setCustomView() pero no afecta el botón Hecho. El Activity.onBackPressed() no se llama cuando ActionMode es comenzar.

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

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

Pero funciona en Android 2.x-3.x solamente, porque en 4.x se utiliza una barra de acción nativa.

Author: Tanya, 2012-07-25

3 answers

Por favor, no lo haga, ya que es una implementación específica y extremadamente no estándar.

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

 35
Author: Jake Wharton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 06:14:11

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();
    }
});
 21
Author: Alexiosdev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-29 12:42:06

Aquí está mi implementación, y es un truco adecuado, pero funciona y realmente no puedo encontrar una alternativa a hacer algo específico cuando se hace clic en el modo de acción HECHO. Me parece muy raro que no puedas capturar este evento con más elegancia.

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, es probable que parte de este código tenga que 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 no he integrado ABS con mi proyecto actual.

 10
Author: Eurig Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-28 21:08:36