contextual action mode時は以下のような画面になります。
コンテキストメニューはポップアップ形式でメニュー項目が表示されますが、contextual action modeではアクションバーに項目が表示されます。また、コンテキストメニュー表示中はメニュー以外のUI要素は操作不可ですが、contextual action modeならメニュー項目表示中でもUI要素を操作可能です。
以下がcontextual action modeを使用するサンプルコードです。
チェックボックス付きリストビューの項目を長押ししたときにaction modeに移行し、action modeのメニュー1選択時に現在チェックされている項目一覧をToastで表示しています( 1個も選択されていない時のメッセージが変ですが、サンプルなので大目に見てください(^^;) )
public class CAMSampleActivity extends ListActivity { private final CAMSampleActivity activity = this; private final String[] m_listViewItem = { "ListItem1", "ListItem2", "ListItem3", "ListItem4", "ListItem5" }; private ActionMode m_actionMode = null; private final ActionMode.Callback actionModeCallback = new ActionMode.Callback() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // action modeの表示直前に呼ばれる return true; } @Override public void onDestroyActionMode(ActionMode mode) { // action modeが終了し破棄されるときに呼ばれる m_actionMode = null; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // action modeが生成される時に呼ばれる。 // ここでメニューリソースからメニューを作成。 MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.camsample, menu); return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // action modeで項目が選択されたときに呼ばれる switch (item.getItemId()) { case R.id.menu1: // チェックボックスがチェック状態の項目を取得し、Toastを表示 SparseBooleanArray checkedItemPos = activity.getListView().getCheckedItemPositions(); StringBuilder builder = new StringBuilder(); for (int i = 0; i < checkedItemPos.size(); i++) { if (checkedItemPos.valueAt(i)) { builder.append(checkedItemPos.keyAt(i) + 1); builder.append(','); } } builder.append("行目の項目がチェックされています。"); Toast.makeText(activity, builder.toString(), Toast.LENGTH_LONG).show(); // ActionMode.finish()でaction modeを終了させる mode.finish(); return true; default: return false; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // チェックボックス付きのリストビューを作成 ArrayAdaptercontextual action modeにするには、Activity.startActionMode()にActionMode.Callbackを渡すだけです。contextual action modeの動作はActionMode.Callbackのオーバーライドメソッドで定義します。adapter = new ArrayAdapter (this, android.R.layout.simple_list_item_multiple_choice, m_listViewItem); this.setListAdapter(adapter); this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // リストビューの項目を長押ししたときにaction modeに移行するようにリスナを設定 this.getListView().setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { // action mode作成済みの場合は何もしない if (m_actionMode != null) { return false; } // Activity.startActionMode()でaction modeに移行 m_actionMode = activity.startActionMode(actionModeCallback); return true; } }); } }
上記のサンプルを実際に動かすと以下のような動作になります。
1. リストビューの項目を長押ししてcontextual action modeに移行した画面
2. 1の状態でチェックボックスをチェックし、メニュー1(アイコン)を押下したときの画面
このようにcontextual action modeなら複数のUI要素に対し、一括処理が可能です。
0 件のコメント:
コメントを投稿