17

Android 3.0 では、たとえばテキストを選択すると、ActionBar が ContextMenu のようなモードに切り替わり、選択したテキストに対してコピー/共有などのアクションを実行できるようになり、左側に [完了] ボタンが表示されます。ユーザーがこのモードを終了できるようにします。

アプリで ActionBar をこのモードに切り替えるにはどうすればよいですか (もちろん、メニュー項目を使用して)。ドキュメントでこれを見つけることができませんでした。

4

3 に答える 3

33

ここに画像の説明を入力

新しいコンテキスト アクション バーを使用するには、「個々のビューでコンテキスト アクション モードを有効にする」を参照してください。それは述べています:

ユーザーが特定のビューを選択したときにのみコンテキスト アクション モードを起動する場合は、次のことを行う必要があります。

  1. インターフェイスを実装しActionMode.Callbackます。そのコールバック メソッドでは、コンテキスト アクション バーのアクションを指定したり、アクション アイテムのクリック イベントに応答したり、アクション モードの他のライフサイクル イベントを処理したりできます。
  2. startActionMode()バーを表示したいときに呼び出します (ユーザーがビューを長押ししたときなど)。

例えば:

  1. 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 が設定されていることにも注意してください。次のステップでは、初期化の方法と、メンバー変数をアクティビティまたはフラグメントに保存することがどのように役立つかを確認します。

  2. 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 でバッチ コンテキスト アクションを有効にする

ListViewまたはGridView(または の別の拡張子)に項目のコレクションがあり、AbsListViewユーザーがバッチ操作を実行できるようにする場合は、次のことを行う必要があります。

例えば:

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()

于 2012-09-30T21:58:02.093 に答える
18

ええ、私も見つけられませんでした。Google I|O で尋ねなければなりませんでした。

を使用しstartActionMode()ます。これは、それを示すサンプルの 1 つです。私はこの分野でもっと仕事をする必要があります。

于 2011-05-28T15:48:13.497 に答える
6

少し遅れるかもしれませんが、アクションモードのチュートリアルは次のとおりです: http ://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar

于 2012-08-16T09:06:35.827 に答える