webentwicklung-frage-antwort-db.com.de

Kontextbezogene Aktionsleiste für Android-Kompatibilität

Beim Versuch, die Android-Designrichtlinien zu befolgen, stößt ich auf ein kleines Dilemma.

Ich möchte eine Liste mit Elementen haben, von denen ich mehrere auswählen kann (Mehrfachauswahl) und dann Massenaktionen für sie ausführen kann.

Die Design-Richtlinien schlagen vor, dafür die kontextuelle Aktionsleiste zu verwenden, und es klingt genau wie ich es mir vorgestellt habe. Das Problem ist, ich versuche, die Kompatibilität zu API 7 aufrechtzuerhalten (weil mein Telefon derzeit 2.3.3 ist). 

Ich benutze ActionBarSherlock , um andere Actionbar-Sachen zu bekommen, aber ich scheine nicht herauszufinden, wie ich es schaffen kann, entweder eine kontextabhängige Aktionsleiste zu starten, oder ich habe nicht herausgefunden, wie man der ActionBar beliebig Schaltflächen hinzufügt in ABS. Ich sehe, dass Sie Tabs machen können. Vielleicht ist das die Antwort. Da ich jedoch die Mehrfachauswahl zulasse, möchte ich nicht das normale modale Kontextmenü verwenden.

25
Paul

Das Einrichten der kontextabhängigen Aktionsleiste ist das Gleiche wie das Einrichten der 'regulären' ActionBar-Elemente in Bezug auf XML. Dieses Beispiel im Entwicklerhandbuch erklärt alles .

Um ActionBarSherlock zu verwenden, ersetzen Sie die Standard-Android-Callbacks durch die mit ActionBarSherlock bearbeiteten Callbacks (verwenden Sie statt Android.View.ActionMode beispielsweise com.actionbarsherlock.view.ActionMode).

16
Reinier

Dies ist eine späte Antwort, aber ich denke, dass die Leute dabei helfen würden, festzuhalten. 

Das Öffnen der kontextabhängigen Aktionsleiste ist eigentlich ganz einfach. Zu jedem Zeitpunkt Ihrer Aktivität müssen Sie nur anrufen:

startActionMode(mActionModeCallback);

Wenn Sie sich nicht in Ihrer Hauptaktivität befinden, wie in Fragmenten, können Sie mit eine Referenz erhalten 

getSherlockActivity().startActionMode(mActionModeCallback);

und das ist der Rückruf

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

Die XML-Datei ist ein einfaches Menü wie die Aktionsleiste:

<?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 hat eine eigene Implementierung von ActionMode, aber Sie müssen den Lebenszyklus manuell steuern. Dazu habe ich ein Tutorial geschrieben. 

2
orto gonaliy

Für ein langes Klick-Beispiel finden Sie die folgenden Links. Der erste ist Java-Code, der für das Beispiel benötigt wird. Die zweite ist, wie das Layout definiert wird.

1
burak altundal

Ich stand vor demselben Problem. Es wurde gelöst, als ich diesen Link gefunden habe. Grundsätzlich müssen Sie eine Callback-Klasse erstellen, die ActionMode.Callback implementiert. In dieser Klasse erweitern Sie die Aktionsleiste mit Ihrer kontextabhängigen Aktionsleiste. Bei jeder Auswahl (oder langem Klicken) starten Sie den Rückruf mit der startActionMode-Methode. Siehe den Link für einen Arbeitscode =]

EDIT: Es gibt auch ein Beispiel zu Sherlocks Samples unter /samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.Java

0
Alesqui

Ich werde den zweiten Teil Ihrer Frage beantworten. Beispiel: Hinzufügen einer View-Instanz (Schaltfläche im nachstehenden Code) mit der ActionBarSherlock-Bibliothek:

@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