Android入门笔记(七)

七、工具栏的使用

 

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 方法,从而达到更新子标题的目的。

猜你喜欢

转载自blog.csdn.net/qq_40697071/article/details/82831626
今日推荐