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);
// チェックボックス付きのリストビューを作成
ArrayAdapter 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;
}
});
}
}
contextual action modeにするには、Activity.startActionMode()にActionMode.Callbackを渡すだけです。contextual action modeの動作はActionMode.Callbackのオーバーライドメソッドで定義します。上記のサンプルを実際に動かすと以下のような動作になります。
1. リストビューの項目を長押ししてcontextual action modeに移行した画面
2. 1の状態でチェックボックスをチェックし、メニュー1(アイコン)を押下したときの画面
このようにcontextual action modeなら複数のUI要素に対し、一括処理が可能です。
0 件のコメント:
コメントを投稿