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

在Android 3.0中,当你select一些文本时,ActionBar切换到一个类似于ContextMenu的模式,它可以让你用选定的文本进行操作:copy / share / etc,左边出现一个“完成”button使用户能够离开这个模式。

我怎样才能在我的应用程序切换到这种模式(当然我的菜单项)的ActionBar? 我只是无法在文档中find这个。

Solutions Collecting From Web of "如何调用ActionBar的类似ContextMenu的行为?"

是的,我也找不到它 – 我必须向Google I | O询问。

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

在这里输入图像说明

要使用新的上下文操作栏 ,请参阅“ 为各个视图启用上下文操作模式 ”。 它指出:

如果您只想在用户select特定视图时调用上下文操作模式,则应该:

  1. 实现ActionMode.Callback接口。 在其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; } };
    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; } }; 

    请注意,这些事件callback与选项菜单的callback几乎完全相同,除了每个callback都传递与事件关联的ActionMode对象。 您可以使用ActionMode API对CAB进行各种更改,例如使用setTitle()setSubtitle() (用于指示select了多less项)来修改标题和副标题。

    另请注意,上述示例在操作模式被破坏时将mActionModevariables设置为null。 在下一步中,您将看到如何初始化以及如何将成员variables保存在您的活动或片段中可能会有用。

  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; } });
    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() ,系统返回创build的ActionMode 。 通过将其保存在成员variables中,您可以更改上下文操作栏以响应其他事件。 在上面的示例中, ActionMode用于确保ActionMode实例在启动操作模式之前,通过检查成员是否为空来重新创build。

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

如果您在ListViewGridView (或AbsListView另一个扩展)中拥有一组项目,并且想要允许用户执行批处理操作,则应该:

  • 实现AbsListView.MultiChoiceModeListener接口,并使用setMultiChoiceModeListener()将其设置为视图组。 在侦听器的callback方法中,您可以指定上下文操作栏的操作,响应操作项上的单击事件,并处理从ActionMode.Callback接口inheritance的其他callback。
  • 使用CHOICE_MODE_MULTIPLE_MODAL参数调用setChoiceMode()

例如:

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

     @覆盖
     public void onItemCheckedStateChanged(ActionMode mode,int position,
                                          长ID,布尔检查){
         //在select/取消select项目时,您可以执行某些操作,
         //比如更新CAB中的标题
     }

     @覆盖
     public boolean onActionItemClicked(ActionMode mode,MenuItem item){
         //响应点击CAB中的操作
         switch(item.getItemId()){
            案例R.id.menu_delete:
                 deleteSelectedItems();
                 mode.finish();  //采取行动,closuresCAB
                返回true;
            默认:
                返回false;
         }
     }

     @覆盖
     public boolean onCreateActionMode(ActionMode mode,Menu menu){
         //膨胀CAB的菜单
         MenuInflater inflater = mode.getMenuInflater();
         inflater.inflate(R.menu.context,menu);
        返回true;
     }

     @覆盖
     public void onDestroyActionMode(ActionMode mode){
         //在这里,您可以对活动进行必要的更新
         // CAB被删除。 默认情况下,选中的项目被取消select/取消选中。
     }

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

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

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

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