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