36 votes

Comment reconnaître si le bouton Terminé est cliqué dans ActionMode

J'utilise ActionMode pour sélectionner des éléments dans une grille. Le problème est que je ne peut pas reconnaître si le Fait bouton est cliqué. La seule que je peux c'est de savoir qu' ActionMode est terminé. Mais en appuyant sur le Dos des finitions de la ActionMode trop. Le comportement désiré est d'accepter de sélection sur le Fait de cliquer et de sortie ActionMode sur l'Arrière de la presse.

J'ai essayé d'utiliser ActionMode.setCustomView() , mais il n'a pas d'incidence sur le Fait de bouton. L' Activity.onBackPressed() n'est pas appelé lorsque ActionMode est commencé.

La seule solution que j'ai trouvé est d'utiliser ActionBarSherlock et obtenir le Fait bouton manuellement:

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

Mais il fonctionne sur Android 2.x-3.x seulement, parce que le 4.x un natif de la barre d'action est utilisé.

36voto

Jake Wharton Points 26095

S'il vous plaît ne faites pas cela car c'est spécifique à l'implémentation et extrêmement non standard.

Vous pouvez utiliser le rappel onDestroyActionMode lorsqu’un mode action est rejeté.

21voto

Alexiosdev Points 177

Voici la solution:

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

10voto

Amorgos Points 2163

Voici ma mise en œuvre, et c'est un bon hack, mais il fonctionne et je ne peux pas vraiment trouver une alternative pour faire quelque chose de spécifique quand le ActionMode FAIT est cliqué. Je trouve ça vraiment bizarre que vous ne pouvez pas capturer cet événement de manière plus élégante.

Des suggestions à faire de celle-ci un peu moins moche serait grandement apprécié...

Dans mon activité..

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 vous êtes à l'aide de Fragments avec votre Activité, alors une partie de ce code devra probablement être dans le Fragment, et les autres bits dans l'Activité.

@JakeWharton (et d'autres ActionBarSherlock utilisateurs) si vous voyez ceci sur votre voyage. Je serais intéressé de savoir si le ci-dessus est compatible avec l'ABS que je n'ai pas encore intégrer ABS avec mon projet en cours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X