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与事件关联的对象。您可以使用ActionModeAPI 对 CAB 进行各种更改,例如使用setTitle()and修改标题和副标题setSubtitle()(用于指示选择了多少项)。

    另请注意,上面的示例在mActionMode销毁操作模式时将变量设置为 null。在下一步中,您将看到它是如何初始化的,以及将成员变量保存在您的活动或片段中是如何有用的。

  2. 在适当的时候调用startActionMode()以启用上下文操作模式,例如响应长按 a 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创建的。通过将其保存在成员变量中,您可以更改上下文操作栏以响应其他事件。在上面的示例中 ,通过在启动操作模式之前检查成员是否为空ActionMode来确保ActionMode实例已经处于活动状态时不会重新创建。

在 ListView 或 GridView 中启用批处理上下文操作

ListView如果您在or GridView(或 的另一个扩展名)中有一组项目,AbsListView并希望允许用户执行批处理操作,您应该:

例如:

ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

    @覆盖
    public void onItemCheckedStateChanged(ActionMode 模式,int 位置,
                                          长 id,布尔检查){
        // 这里你可以在选择/取消选择项目时做一些事情,
        // 比如更新CAB中的title
    }

    @覆盖
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        //响应点击CAB中的动作
        开关(item.getItemId()){
            案例 R.id.menu_delete:
                deleteSelectedItems();
                mode.finish(); // 动作被选中,所以关闭 CAB
                返回真;
            默认:
                返回假;
        }
    }

    @覆盖
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // 为 CAB 充气菜单
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context,菜单);
        返回真;
    }

    @覆盖
    公共无效 onDestroyActionMode(ActionMode 模式) {
        // 在这里您可以对活动进行任何必要的更新
        // CAB 被移除。默认情况下,选定的项目被取消选择/取消选中。
    }

    @覆盖
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // 在这里您可以对 CAB 执行更新,因为
        // 一个invalidate()请求
        返回假;
    }
});

就是这样。现在,当用户长按选择一个项目时,系统会调用该onCreateActionMode() 方法并显示具有指定操作的上下文操作栏。当上下文操作栏可见时,用户可以选择其他项目。

在上下文操作提供通用操作项的某些情况下,您可能需要添加一个复选框或类似的 UI 元素以允许用户选择项,因为他们可能不会发现长按行为。当用户选中复选框时,您可以通过使用 将相应的列表项设置为选中状态来调用上下文操作模式setItemChecked()

于 2012-09-30T21:58:02.093 回答
18

是的,我也找不到——我不得不在 Google I|O 上问。

使用startActionMode(). 这是他们演示的示例之一。我自己需要在这方面做更多的工作。

于 2011-05-28T15:48:13.497 回答
6

也许有点晚了,但这里有一个动作模式的教程: http ://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar

于 2012-08-16T09:06:35.827 回答