[Android]contextual action modeを使う。 | 妄想プログラマのらくがき帳

2013年8月14日水曜日

[Android]contextual action modeを使う。

Android3.0以上のバージョンでは、コンテキストメニューの代わりにcontextual action modeが使用できます。

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 件のコメント:

コメントを投稿