在Android 3.0中,当您选择某些文本时,ActionBar会切换到类似ContextMenu的模式,这样您就可以使用所选文本执行操作:复制/共享/等,并显示“完成”按钮左侧使用户可以离开此模式。
如何在我的应用程序中将ActionBar切换到此模式(当然还有我的菜单项)?我在文档中找不到这个。
答案 0 :(得分:32)
要使用新的contextual action bar,请参阅“Enabling the contextual action mode for individual views”。 它声明:
如果只想在用户选择特定的情况下调用上下文操作模式 观点,你应该:
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()
和setSubtitle()
的字幕(用于表示有多少项目
选择)。
另请注意,上面的示例将mActionMode
变量设置为null
动作模式被破坏。在下一步中,您将看到它是如何初始化以及如何保存的
您的活动或片段中的成员变量可能很有用。
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
行动模式。
如果您在ListView
或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() {
@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