2012-07-25 15 views
35

Utilizo ActionMode para seleccionar elementos en una cuadrícula. El problema es que no puedo reconocer si se hizo clic exactamente en el botón Hecho. Lo único que puedo hacer es saber que el ActionMode ha terminado. Pero al presionar Atrás finaliza también el ActionMode. El comportamiento deseado es aceptar la selección en Hecho hacer clic, y salir ActionMode en Atrás pulsar.Cómo reconocer si se hace clic en el botón Hecho en el Modo de acción

Intenté usar ActionMode.setCustomView() pero no afecta al botón Hecho. No se llama al Activity.onBackPressed() cuando se inicia ActionMode.

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

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

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

Respuesta

35

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.

+0

Veo, pero estoy implementando un selector con soporte multiselección y pensé que el botón Hecho es la mejor manera de aceptar la selección ... De cualquier forma, gracias por su respuesta! Parece que tengo que agregar un elemento de menú para aceptar los elementos seleccionados. – Tanya

+9

Pero, ¿cómo podemos distinguir del botón hecho y el botón Atrás? Necesito implementar diferentes acciones para esos ... –

+0

Es posible que pueda interceptar 'onBackPressed'. De lo contrario, no puedes. –

21

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(); 
    } 
}); 
+4

solo una nota al margen: preste atención que llama 'findViewById' de la actividad donde inició el modo de acción y no desde otra vista, o obtendrá una' excepción de puntero nulo'. –

+1

Esto no funciona con ABS en dispositivos pre-ICS como Gingerbread. – bk138

+1

Este código solo funciona en API LEVEL> = 11 Necesita agregar la condición API LEVEL: Ver doneButton; if (android.os.Build.VERSION.SDK_INT> = 11) { doneButton = Resources.getSystem(). GetIdentifier ("action_mode_close_button", "id", "android"); } else { doneButton = findViewById (R.id.abs__action_mode_close_button); } – Alexiosdev

10

Aquí es mi aplicación, y un corte adecuado pero funciona y realmente no puedo encontrar una alternativa a hacer algo específico cuando se hace clic en el ActionMode HECHO. Me parece realmente extraño que no puedas capturar este evento de forma más elegante.

Cualquier sugerencia a hacer de este 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 a continuación, algunos de este código será probablemente necesita estar en el Fragmento, y los otros bits en la Actividad.

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

+0

Esto funcionó, pero estoy usando modos de acción en algunos lugares de mi proyecto. Así que decidí agregar MenuItems a los modos de acción y usarlos como los elementos "confirmar". El principal convertí el ícono en un descarte. Esto hace que el código sea mucho menos hacky. –

+0

Funciona de maravilla gracias a eso – Cilenco

+0

Parece que esto también detectaría cuándo se hace clic en los elementos normales del menú, no solo cuando se presiona el botón Hecho. – JDJ

Cuestiones relacionadas