如何调用ActionBar的类似ContextMenu的行为?

Zso*_*agy 17 android android-3.0-honeycomb contextual-action-bar

在Android 3.0的,当你选择,例如一些文本,将动作条切换到文本菜单式模式,使您能够与所选文本做的动作:复制/股/ etc和"完成"按钮将出现在左侧使用户能够离开此模式.

如何在我的应用程序中将ActionBar切换到此模式(当然是我的菜单项)?我在文档中找不到这个.

Jef*_*rod 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()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中启用批处理上下文操作

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

例如:

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

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position,
                                          long id, boolean checked) {
        // Here you can do something when items are selected/de-selected,
        // such as update the title in the CAB
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
            case R.id.menu_delete:
                deleteSelectedItems();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context, menu);
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        // Here you can make any necessary updates to the activity when
        // the CAB is removed. By default, selected items are deselected/unchecked.
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // Here you can perform updates to the CAB due to
        // an invalidate() request
        return false;
    }
});

而已.现在,当用户选择具有长按的项目时,系统将调用该onCreateActionMode() 方法并显示具有指定操作的上下文操作栏.当上下文操作栏可见时,用户可以选择其他项目.

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

  • 将官方文档中的内容复制到答案中是否可以接受?原始内容是Creative-commons许可的,但这里的归因不够明确. (3认同)

Com*_*are 18

是的,我也找不到 - 我不得不问Google I | O.

使用startActionMode().以下是他们展示它的样本之一.我自己需要在这个领域做更多的工作.


Tob*_*ias 6

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