七、工具栏的使用
7.1 工具栏菜单的创建
(1)在 res/menu 中创建资源类型为 Menu ,且命名同工具栏所在页面布局(layout 中的文件)命名保持一致。这个文件和其所在页面的布局文件同名,只是位于不同的目录,当实例化组件时,系统会分别取不同的目录下进行加载。
(2)出于兼容性考虑,AppCompat 库需要使用 app 命名空间。所以在菜单资源文件中使用 xmlns 标签定义全新的 app 命名空间,并在 showAsAction 属性(属性详情见下文)中使用。
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/add_article"
android:icon="@drawable/ic_menu_add"
android:title="@string/new_article"
app:showAsAction="ifRoom|withText"/>
</menu>
(3)可以使用 Android Studio 内置的 Android Asset Studio 工具来为工具栏一次性创建或定制多种不同类型大小的图片。
使用方法为:在项目工具窗口中,右键单击 drawable 目录,选择 New -> Image Asset 菜单项,在弹出的窗口中,先在 Icon Type 中选择 Action Bar and Tab Icons 属性,之后可在 Clip Art 中进行图片的选择,最后点击 Next 进行预览,之后点击 Finish 后 Android 即会自动的为你生成不同尺寸的图片并放置到对应的文件夹中。
(4)在 fragment 中重写 onCreateOptionsMenu 方法,使用 MenuInflater.Inflate 方法并传入菜单文件的资源 ID ,将布局文件中定义的菜单项目填充到 Menu 实例中。同时作为一项开发规范,我们应当调用该超类的方法,这样任何定义的选项菜单功能在子类方法中都能获得应用。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_article_list, menu);
}
(5)在 fragment 的 onCreate 方法中调用 setHasOptionsMenu 来告诉 FragmentManager 当 activity 接收到操作系统的 onCreateOptionsMenu 方法的回调请求时,应使用其管理的 fragment 来就收方法的调用指令。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.add_article:
add();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
(6)重写 onOptionsItemSelected 方法,通过 item.getItemId 方法获得 ItemId 后再通过 switch 来判断被点击的菜单项目,并在 case 分别使用不同的处理方法,同时注意该方法的返回值为 Boolean 类型,即当事件被正确分发处理时,应返回 true ,否则默认调用超类的方法。
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
7.2 showAsAction 属性
showAsAction 属性用于指定菜单项是否显示在工具栏上,还是隐藏于溢出菜单。如果该属性设置为 ifRoom 和 withText 的组合值,因此,只要空间足够,菜单项图标及其文字描述都会显示在工具栏上。如果空间仅够显示菜单项图标,文字描述就不会显示。如果空间大小不够显示任何项,菜单项就会隐藏到溢出菜单中。另外该属性还有另外两个可选值:always 和 never 。不推荐使用 always,应尽量使用 ifRoom 属性值,让操作系统决定如何显示菜单项。对于那些很少用到的菜单项,never 属性值是个不错的选择。
7.3 实现层级式导航
作用:层级式导航可在应用内逐级向上导航,即我们使用 app 时,左上角的那个后退箭头。
使用方法:只需在 AndroidManifest.xml 的 Activity 中添加 parentActivityName 属性,即可开启应用的层级式导航。
<activity android:name=".ArticlePagerActivity"
android:parentActivityName=".ArticleListActivity">
</activity>
7.4 工具栏子标题的设置
(1)首先获取当前 fragment 的托管 activity ,并将其转换为 AppCompatActivity 类型,之后调用其 getSupportActionBar().setSubtitle() 方法来设置工具栏的之标题即可。
(2)可使用 MenuItem.findItem 方法来获取工具栏的子标题,并调用其 setTitle 方法来对子标题进行更新。
7.5 invalidateOptionsMenu 方法
此方法将使原填充的菜单项无效,当用户再次访问菜单时,再次调用 onCreateOptionsMenu 方法,从而达到更新子标题的目的。