Android 3.0 では、たとえばテキストを選択すると、ActionBar が ContextMenu のようなモードに切り替わり、選択したテキストに対してコピー/共有などのアクションを実行できるようになり、左側に [完了] ボタンが表示されます。ユーザーがこのモードを終了できるようにします。
アプリで ActionBar をこのモードに切り替えるにはどうすればよいですか (もちろん、メニュー項目を使用して)。ドキュメントでこれを見つけることができませんでした。
Android 3.0 では、たとえばテキストを選択すると、ActionBar が ContextMenu のようなモードに切り替わり、選択したテキストに対してコピー/共有などのアクションを実行できるようになり、左側に [完了] ボタンが表示されます。ユーザーがこのモードを終了できるようにします。
アプリで ActionBar をこのモードに切り替えるにはどうすればよいですか (もちろん、メニュー項目を使用して)。ドキュメントでこれを見つけることができませんでした。
新しいコンテキスト アクション バーを使用するには、「個々のビューでコンテキスト アクション モードを有効にする」を参照してください。それは述べています:
ユーザーが特定のビューを選択したときにのみコンテキスト アクション モードを起動する場合は、次のことを行う必要があります。
ActionMode.Callback
ます。そのコールバック メソッドでは、コンテキスト アクション バーのアクションを指定したり、アクション アイテムのクリック イベントに応答したり、アクション モードの他のライフサイクル イベントを処理したりできます。startActionMode()
バーを表示したいときに呼び出します (ユーザーがビューを長押ししたときなど)。例えば:
ActionMode.Callback
インターフェイスを
実装します。
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
// Called when the action mode is created; startActionMode() was called
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
return true;
}
// Called each time the action mode is shown. Always called after onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false; // Return false if nothing is done
}
// Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_share:
shareCurrentItem();
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}
}
// Called when the user exits the action mode
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
};
これらのイベント コールバックは、オプション メニューのコールバックとほとんど同じであることに注意してください。ただし、これらはそれぞれActionMode
、イベントに関連付けられたオブジェクトも渡します。API を使用ActionMode
して、CAB にさまざまな変更を加えることができます。たとえば、タイトルやサブタイトルをsetTitle()
andで修正することができますsetSubtitle()
(選択されているアイテムの数を示すのに役立ちます)。
mActionMode
上記のサンプルでは、アクション モードが破棄されたときに変数 null が設定されていることにも注意してください。次のステップでは、初期化の方法と、メンバー変数をアクティビティまたはフラグメントに保存することがどのように役立つかを確認します。
startActionMode()
を長押しした場合など、適切な場合にコンテキスト アクション モードを有効にするために呼び出しView
ます。
someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
if (mActionMode != null) {
return false;
}
// Start the CAB using the ActionMode.Callback defined above
mActionMode = getActivity().startActionMode(mActionModeCallback);
view.setSelected(true);
return true;
}
});
を呼び出すstartActionMode()
と、システムは作成された を返しますActionMode
。これをメンバー変数に保存することで、他のイベントに応じてコンテキスト アクション バーに変更を加えることができます。上記のサンプルでは
、アクション モードを開始する前にメンバーが null かどうかActionMode
を確認することで、インスタンスが既にアクティブな場合にインスタンスが再作成されないようにするために使用されます。ActionMode
ListView
またはGridView
(または の別の拡張子)に項目のコレクションがあり、AbsListView
ユーザーがバッチ操作を実行できるようにする場合は、次のことを行う必要があります。
AbsListView.MultiChoiceModeListener
し、ビュー グループに設定しsetMultiChoiceModeListener()
ます。リスナーのコールバック メソッドでは、コンテキスト アクション バーのアクションを指定したり、アクション アイテムのクリック イベントに応答したり、ActionMode.Callback
インターフェイスから継承された他のコールバックを処理したりできます。setChoiceMode()
引数を指定して呼び出しCHOICE_MODE_MULTIPLE_MODAL
ます。例えば:
ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(新しい MultiChoiceModeListener() {
@オーバーライド
public void onItemCheckedStateChanged(ActionMode モード、int 位置、
long id、ブールチェック済み) {
// ここでは、アイテムが選択/選択解除されたときに何かを行うことができます。
// CAB のタイトルを更新するなど
}
@オーバーライド
public boolean onActionItemClicked(ActionMode モード、MenuItem 項目) {
// CAB 内のアクションのクリックに応答する
スイッチ (item.getItemId()) {
ケース R.id.menu_delete:
deleteSelectedItems();
mode.finish(); // アクションが選択されたので、CAB を閉じます
true を返します。
デフォルト:
false を返します。
}
}
@オーバーライド
public boolean onCreateActionMode(ActionMode モード、メニュー メニュー) {
// CAB のメニューを拡張します
MenuInflater インフレータ = mode.getMenuInflater();
inflater.inflate(R.menu.context, メニュー);
true を返します。
}
@オーバーライド
public void onDestroyActionMode(ActionMode モード) {
// ここで、アクティビティに必要な更新を行うことができます。
// CAB が削除されます。デフォルトでは、選択された項目は選択解除/チェック解除されています。
}
@オーバーライド
public boolean onPrepareActionMode(ActionMode モード、メニュー メニュー) {
// ここで、CAB の更新を実行できます。
//invalidate()
リクエスト
false を返します。
}
});
それでおしまい。ユーザーが長押しでアイテムを選択すると、システムはonCreateActionMode()
メソッドを呼び出し、指定されたアクションでコンテキスト アクション バーを表示します。コンテキスト アクション バーが表示されている間、ユーザーは追加の項目を選択できます。
コンテキスト アクションが一般的なアクション アイテムを提供する場合には、長いクリック動作をユーザーが発見できない可能性があるため、ユーザーがアイテムを選択できるようにするチェックボックスまたは同様の UI 要素を追加することが必要になる場合があります。ユーザーがチェックボックスを選択すると、 でそれぞれのリスト項目をチェック済みの状態に設定することで、コンテキスト アクション モードを呼び出すことができますsetItemChecked()
。
ええ、私も見つけられませんでした。Google I|O で尋ねなければなりませんでした。
を使用しstartActionMode()
ます。これは、それを示すサンプルの 1 つです。私はこの分野でもっと仕事をする必要があります。
少し遅れるかもしれませんが、アクションモードのチュートリアルは次のとおりです: http ://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar