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

时间:2011-05-28 15:32:29

标签: android android-3.0-honeycomb contextual-action-bar

在Android 3.0中,当您选择某些文本时,ActionBar会切换到类似ContextMenu的模式,这样您就可以使用所选文本执行操作:复制/共享/等,并显示“完成”按钮左侧使用户可以离开此模式。

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

3 个答案:

答案 0 :(得分:32)

enter image description here

要使用新的contextual action bar,请参阅“Enabling the contextual action mode for individual views”。 它声明:

如果只想在用户选择特定的情况下调用上下文操作模式 观点,你应该:

      
  1. 实施ActionMode.Callback界面。在它的回调方法中,你 可以指定上下文操作栏的操作,响应操作项上的单击事件,以及处理操作模式的其他生命周期事件。
  2.   
  3. 如果要显示,请致电startActionMode() 栏(例如当用户长按视图时)。
  4. 例如:

        
    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对象。您可以使用ActionMode API对CAB进行各种更改,例如修改标题和 带有setTitle()setSubtitle()的字幕(用于表示有多少项目 选择)。

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

    2.   
    3. 致电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已创建。通过将其保存在成员变量中,您可以 更改上下文操作栏以响应其他事件。在上面的例子中, ActionMode用于确保ActionMode实例 如果它已经处于活动状态,则不会重新创建,方法是在启动之前检查该成员是否为null 行动模式。

    4. 在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()

答案 1 :(得分:17)

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

使用startActionMode()。表明它的Here is one of their samples。我自己需要在这个领域做更多的工作。

答案 2 :(得分:5)

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