web-dev-qa-db-fra.com

Barre d'action contextuelle de compatibilité Android

En essayant de suivre les directives de conception Android, je me heurte à un petit dilemme.

Je souhaite disposer d'une liste d'éléments que je peux appuyer longuement sur plusieurs (sélection multiple), puis effectuer des actions en bloc sur ceux-ci.

Les directives de conception suggèrent l’utilisation de la barre d’action contextuelle, ce qui correspond parfaitement à ce que j’avais en tête. Le problème, c'est que j'essaie de maintenir la compatibilité avec API 7 à l'envers (car mon téléphone est actuellement 2.3.3). 

J'utilise ActionBarSherlock pour obtenir d'autres éléments de la barre d'action, mais je n'arrive pas à comprendre comment l'obtenir pour déclencher une barre d'action contextuelle, ni savoir ajouter des boutons de manière arbitraire à la barre d'action. en ABS. Je vois que vous pouvez faire des onglets, alors c'est peut-être la solution, mais comme j'essaie d'autoriser la sélection multiple, je ne veux pas avoir le menu contextuel modal normal.

25
Paul

La configuration de la barre d’action contextuelle est identique à celle des éléments ActionBar «normaux» en ce qui concerne le code XML. Cet exemple dans le guide du développeur explique tout .

Pour utiliser ActionBarSherlock, remplacez les rappels Android par défaut par les rappels modifiés par ActionBarSherlock (par exemple, au lieu de Android.View.ActionMode, utilisez com.actionbarsherlock.view.ActionMode).

16
Reinier

C'est une réponse tardive, mais je pense que cela aiderait les gens bloqués. 

Ouvrir la barre d’action contextuelle est en fait assez simple. À tout moment de votre activité, vous devez simplement appeler:

startActionMode(mActionModeCallback);

Si vous n’êtes pas dans votre activité principale, comme dans les fragments, vous pouvez obtenir une référence avec 

getSherlockActivity().startActionMode(mActionModeCallback);

et c'est le rappel

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback(){

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
          MenuInflater inflater = mode.getMenuInflater();
          inflater.inflate(R.menu.actionbar_context_menu, menu);
          return true;
        }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item1:
                return true;
            case R.id.menu_item2:
                //close the action mode
                //mode.finish();
                return true;
            default:
                mode.finish();
                return false;
       }
    }
};

Le XML est un menu simple comme celui de la barre d’action:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

<item Android:id="@+id/menu_item1"
      Android:icon="@drawable/ic_item1"
      Android:title="@string/ITEM1"
      Android:showAsAction="always|withText" />

<item Android:id="@+id/menu_item2"
      Android:icon="@drawable/ic_item2"
      Android:title="@string/ITEM2"
      Android:showAsAction="always|withText" />

22
sokie

ActionBarSherlock a sa propre implémentation d'ActionMode, mais vous devrez contrôler manuellement son cycle de vie, j'ai écrit un tutorial à ce sujet. 

2
orto gonaliy

Pour un long clic, veuillez vous référer aux liens ci-dessous. Le premier est le code Java requis pour l'échantillon. Et deuxièmement, comment définir la mise en page;

1
burak altundal

Je faisais face au même problème. Il a été résolu lorsque j'ai trouvé ce lien . Fondamentalement, vous devez créer une classe de rappel qui implémente ActionMode.Callback. Dans cette classe, vous gonflez la barre d’action avec votre barre d’action contextuelle. À chaque sélection (ou clic long), vous démarrez le rappel à l'aide de la méthode startActionMode. Voir le lien pour un code de travail =]

EDIT: Il y a aussi un exemple sur les échantillons de Sherlock sous /samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.Java

0
Alesqui

Je vais répondre à la deuxième partie de votre question. Voici un exemple pour ajouter une actionbar à une instance de View (bouton dans le code ci-dessous) avec la bibliothèque ActionBarSherlock:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

        refreshButton = (RotatingButton) LayoutInflater.from(this).inflate(R.layout.actionbar_customview_refresh, null);
        refreshButton.setOnClickListener(refreshButtonListener);

        MenuItem item = menu.add(0, Android.R.id.copy, 0, getString(R.string.actionbar_refresh));
        item.setActionView(refreshButton);
        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_activity_action_bar, menu);
}
0
Roman Minenok