AndroidX 库的
Toolbar
提供
让用户能够通过不同方式与您的应用互动
添加和处理操作介绍了如何
定义一项操作,该操作可以是按钮,也可以是菜单项。本文档介绍了如何将
两个多功能组件:
- “操作视图”是一种能够在应用栏中提供丰富功能的操作。对于 例如,一个搜索操作视图可让用户在应用栏中输入搜索文字, 来更改 activity 或 fragment。
- “操作提供器”是一种具有自己的自定义布局的操作。最初的操作 显示为按钮或菜单项;当用户点按操作时,操作提供程序会控制 操作的行为。例如,操作提供器可能会响应 通过显示菜单进行点按。
AndroidX 提供了一些专用的操作视图和操作提供程序 widget。例如,
“SearchView
”微件
实现用于输入搜索查询的操作视图。通过
ShareActionProvider
widget 实现用于与其他应用共享信息的操作提供程序。你还可以定义
您自己的操作视图和操作提供程序。
添加操作视图
要添加操作视图,请创建一个
<item>
元素,如
添加和处理操作。请将下列属性之一添加到
<item>
元素:
actionViewClass
:实现操作的 widget 的类actionLayout
:描述操作组件的布局资源
将 showAsAction
属性设置为 "ifRoom|collapseActionView"
或
"never|collapseActionView"
。collapseActionView
标志指示如何
在用户未与其互动时显示微件。如果 widget 位于应用栏中,应用
将微件显示为图标。如果 widget 在溢出菜单中,则应用会显示该 widget
显示为一个菜单项当用户与操作视图互动时,它会展开即可填满应用栏。
例如,以下代码会将 SearchView
widget 添加到应用栏中:
<item android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
如果用户未与微件互动,应用会将该微件显示为指定的图标
上传者:android:icon
。如果应用栏中没有空间,则应用会将操作添加到
菜单。
当用户点按图标或菜单项时,该微件会展开即可填满工具栏,以便 并与之互动
如果您需要配置该操作,请在 activity 的
onCreateOptionsMenu()
回调。您可以通过调用
getActionView()
方法。例如,以下代码可获取 SearchView
的对象引用
widget:
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_activity_actions, menu)
val searchItem = menu?.findItem(R.id.action_search)
val searchView = searchItem?.actionView as SearchView
// Configure the search info and add any event listeners.
return super.onCreateOptionsMenu(menu)
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_activity_actions, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView =
(SearchView) searchItem.getActionView();
// Configure the search info and add any event listeners.
return super.onCreateOptionsMenu(menu);
}
响应操作视图展开
如果操作的 <item>
元素具有 collapseActionView
标记,则
应用将操作视图显示为图标,直到用户与操作视图互动。当用户
点按图标,系统就会自动点按
onOptionsItemSelected()
展开操作视图。如果您的 Activity 子类替换了
onOptionsItemSelected()
方法,您的替换方法必须调用
super.onOptionsItemSelected()
,以便父类可以展开操作视图。
如果您想在操作处于展开或收起状态时执行某些操作,则可以定义一个类,
implements
MenuItem.OnActionExpandListener
,
并将该类的成员传递给
setOnActionExpandListener()
。
例如,您可能想要根据操作视图是展开还是展开来更新 activity。
已收起。以下代码段展示了如何定义和传递监听器:
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.options, menu)
// Define the listener.
val expandListener = object : MenuItem.OnActionExpandListener {
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
// Do something when the action item collapses.
return true // Return true to collapse the action view.
}
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
// Do something when it expands.
return true // Return true to expand the action view.
}
}
// Get the MenuItem for the action item.
val actionMenuItem = menu?.findItem(R.id.myActionItem)
// Assign the listener to that action item.
actionMenuItem?.setOnActionExpandListener(expandListener)
// For anything else you have to do when creating the options menu,
// do the following:
return true
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
// Define the listener.
OnActionExpandListener expandListener = new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when the action item collapses.
return true; // Return true to collapse action view.
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when it expands.
return true; // Return true to expand the action view.
}
};
// Get the MenuItem for the action item.
MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);
// Assign the listener to that action item.
MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);
// For anything else you have to do when creating the options menu,
// do the following:
return true;
}
添加操作提供器
如需声明操作提供器,请在工具栏的菜单中创建 <item>
元素
如添加和处理操作中所述。将
actionProviderClass
属性),并将其设为
操作提供程序类。
例如,以下代码声明了 ShareActionProvider
,它是一个 widget
定义,可让您的应用与其他应用共享数据:
<item android:id="@+id/action_share"
android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>
在这种情况下,无需为微件声明图标,因为
ShareActionProvider
提供自己的图形。如果您使用的是自定义操作
声明图标。
其他资源
- 请参阅
ShareActionProvider
查看将分享操作添加到顶部应用栏的示例。 - 请参阅
ActionProvider
: 详细了解如何创建自定义操作提供器。