在 Android 3.0 中,例如当您选择一些文本时,ActionBar 会切换到类似 ContextMenu 的模式,这使您可以对所选文本进行操作:复制/共享/等,并且左侧会出现一个“完成”按钮使用户能够离开此模式。
如何在我的应用程序中将 ActionBar 切换到此模式(当然还有我的菜单项)?我只是在文档中找不到这个。
在 Android 3.0 中,例如当您选择一些文本时,ActionBar 会切换到类似 ContextMenu 的模式,这使您可以对所选文本进行操作:复制/共享/等,并且左侧会出现一个“完成”按钮使用户能够离开此模式。
如何在我的应用程序中将 ActionBar 切换到此模式(当然还有我的菜单项)?我只是在文档中找不到这个。
要使用新的上下文操作栏,请参阅“为单个视图启用上下文操作模式”。它指出:
如果您只想在用户选择特定视图时调用上下文操作模式,您应该:
ActionMode.Callback
接口。在其回调方法中,您可以指定上下文操作栏的操作、响应操作项上的单击事件以及处理操作模式的其他生命周期事件。startActionMode()
(例如当用户长按视图时)。例如:
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()
and修改标题和副标题setSubtitle()
(用于指示选择了多少项)。
另请注意,上面的示例在mActionMode
销毁操作模式时将变量设置为 null。在下一步中,您将看到它是如何初始化的,以及将成员变量保存在您的活动或片段中是如何有用的。
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
如果您在or GridView
(或 的另一个扩展名)中有一组项目,AbsListView
并希望允许用户执行批处理操作,您应该:
AbsListView.MultiChoiceModeListener
接口并将其设置为视图组setMultiChoiceModeListener()
。在侦听器的回调方法中,您可以指定上下文操作栏的操作,响应操作项上的单击事件,以及处理从ActionMode.Callback
接口继承的其他回调。setChoiceMode()
用参数调用CHOICE_MODE_MULTIPLE_MODAL
。例如:
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()
。
是的,我也找不到——我不得不在 Google I|O 上问。
使用startActionMode()
. 这是他们演示的示例之一。我自己需要在这方面做更多的工作。
也许有点晚了,但这里有一个动作模式的教程: http ://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar