如何调用 ActionBar 的类似 ContextMenu 的行为?
例如,在 Android 3.0 中,当您选择某些文本时,ActionBar 会切换到类似 ContextMenu 的模式,使您能够对所选文本执行操作:复制/共享等,并且左侧会出现“完成”按钮使用户能够离开此模式。
如何在我的应用程序中将 ActionBar 切换到此模式(当然还有我的菜单项)?我只是在文档中找不到这个。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用新的 上下文操作栏,请参阅“为各个视图启用上下文操作模式”。
它指出:
如果您只想在用户选择特定选项时调用上下文操作模式
视图,您应该:
ActionMode.Callback接口。在它的回调方法中,你
可以指定上下文操作栏的操作、响应操作项上的单击事件以及处理操作模式的其他生命周期事件。
startActionMode()< /a>
当你想显示栏(例如当用户长按视图时)。
例如:
ActionMode.Callback接口:
<前><代码>
私有 ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
// 创建动作模式时调用; startActionMode() 被调用
@覆盖
公共布尔onCreateActionMode(ActionMode模式,菜单菜单){
// 膨胀提供上下文菜单项的菜单资源
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context_menu, 菜单);
返回真;
}
// 每次显示操作模式时调用。总是在 onCreateActionMode 之后调用,但是
// 如果模式无效,可能会被多次调用。
@覆盖
public boolean onPrepareActionMode(ActionMode 模式,Menu 菜单) {
返回假; // 如果什么都不做则返回 false
}
// 当用户选择上下文菜单项时调用
@覆盖
public boolean onActionItemClicked(ActionMode 模式, MenuItem 项) {
开关 (item.getItemId()) {
案例 R.id.menu_share:
分享当前项目();
模式.finish(); // 选择操作,因此关闭 CAB
返回真;
默认:
返回假;
}
}
// 当用户退出操作模式时调用
@覆盖
公共无效onDestroyActionMode(ActionMode模式){
mActionMode = null;
}
};
请注意,这些事件回调几乎与选项菜单的回调完全相同,除了每个回调还传递
ActionMode
与事件关联的对象。您可以使用ActionMode
API 来制作对 CAB 进行各种更改,例如修改标题和副标题
setTitle() 和 setSubtitle()< /code> (用于指示有多少件物品
已选择)。
另请注意,上面的示例在以下情况下将
mActionMode
变量设置为 null:行动模式被破坏。在下一步中,您将看到它是如何初始化以及如何保存的
您的活动或片段中的成员变量可能很有用。
startActionMode()< /a>
启用上下文适当时的操作模式,例如响应长按
查看
:<前><代码>
someView.setOnLongClickListener(new View.OnLongClickListener() {
// 当用户长按 someView 时调用
公共布尔onLongClick(查看视图){
if (mActionMode != null) {
返回假;
}
// 使用上面定义的 ActionMode.Callback 启动 CAB
mActionMode = getActivity().startActionMode(mActionModeCallback);
view.setSelected(true);
返回真;
}
});
当您调用
startActionMode()
,系统返回创建的
ActionMode
。通过将其保存在成员变量中,您可以更改上下文操作栏以响应其他事件。在上面的示例中,
ActionMode
用于确保 < code>ActionMode 实例如果它已经处于活动状态,则不会重新创建,方法是在启动之前检查成员是否为空
动作模式。
Enabling batch contextual actions in a ListView or GridView
如果您在
ListView 或
)并想要GridView
(或其他扩展<代码>AbsListView允许用户执行批量操作,您应该:
AbsListView。 MultiChoiceModeListener
接口并设置对于具有
的视图组setMultiChoiceModeListener()
。在监听器的回调方法中,您可以指定操作对于上下文操作栏,响应操作项上的单击事件,并处理其他回调
继承自
ActionMode.Callback
界面。setChoiceMode()
与CHOICE_MODE_MULTIPLE_MODAL
参数。例如:
就是这样。现在,当用户长按选择一个项目时,系统会调用
onCreateActionMode()
方法并显示具有指定操作的上下文操作栏。虽然上下文
操作栏可见,用户可以选择其他项目。
在某些情况下,上下文操作提供通用操作项,您可能
想要添加一个复选框或类似的 UI 元素来允许用户选择项目,因为他们
可能无法发现长按行为。当用户选择该复选框时,您
可以通过将相应的列表项设置为选中来调用上下文操作模式
使用
setItemChecked()。
To use the new contextual action bar, see "Enabling the contextual action mode for individual views".
It states:
If you want to invoke the contextual action mode only when the user selects specific
views, you should:
ActionMode.Callback
interface. In its callback methods, youcan specify the actions for the contextual action bar, respond to click events on action items, and handle other lifecycle events for the action mode.
startActionMode()
when you want to show thebar (such as when the user long-clicks the view).
For example:
ActionMode.Callback
interface:Notice that these event callbacks are almost exactly the same as the callbacks for the options menu, except each of these also pass the
ActionMode
object associated with the event. You can useActionMode
APIs to make various changes to the CAB, such as revise the title andsubtitle with
setTitle()
andsetSubtitle()
(useful to indicate how many items areselected).
Also notice that the above sample sets the
mActionMode
variable null when theaction mode is destroyed. In the next step, you'll see how it's initialized and how saving
the member variable in your activity or fragment can be useful.
startActionMode()
to enable the contextualaction mode when appropriate, such as in response to a long-click on a
View
:When you call
startActionMode()
, the system returnsthe
ActionMode
created. By saving this in a member variable, you canmake changes to the contextual action bar in response to other events. In the above sample, the
ActionMode
is used to ensure that theActionMode
instanceis not recreated if it's already active, by checking whether the member is null before starting the
action mode.
Enabling batch contextual actions in a ListView or GridView
If you have a collection of items in a
ListView
orGridView
(or another extension ofAbsListView
) and want toallow users to perform batch actions, you should:
AbsListView.MultiChoiceModeListener
interface and set itfor the view group with
setMultiChoiceModeListener()
. In the listener's callback methods, you can specify the actionsfor the contextual action bar, respond to click events on action items, and handle other callbacks
inherited from the
ActionMode.Callback
interface.setChoiceMode()
with theCHOICE_MODE_MULTIPLE_MODAL
argument.For example:
That's it. Now when the user selects an item with a long-click, the system calls the
onCreateActionMode()
method and displays the contextual action bar with the specified actions. While the contextual
action bar is visible, users can select additional items.
In some cases in which the contextual actions provide common action items, you might
want to add a checkbox or a similar UI element that allows users to select items, because they
might not discover the long-click behavior. When a user selects the checkbox, you
can invoke the contextual action mode by setting the respective list item to the checked
state with
setItemChecked()
.是的,我也找不到它——我不得不在 Google I|O 上询问。
使用
startActionMode()
。 这是他们的示例之一 这证明了这一点。我自己需要在这方面做更多的工作。Yeah, I couldn't find it either -- I had to ask at Google I|O.
Use
startActionMode()
. Here is one of their samples that demonstrates it. I need to do more work in this area myself.也许有点晚了,但这里有一个关于动作模式的教程:
http://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar
Maybe a bit late but here's a tutorial for the actionmode:
http://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar