《Android平板电脑开发秘籍》——3.7节技巧:在ActionBar中显示子菜单

简介:

本节书摘来自异步社区《Android平板电脑开发秘籍》一书中的第3章,第3.7节技巧:在ActionBar中显示子菜单,作者 【印度】B.M. Harwani,更多章节内容可以访问云栖社区“异步社区”公众号查看

3.7 技巧:在ActionBar中显示子菜单
Android平板电脑开发秘籍
为了能在ActionBar中显示显示子菜单,需要将子菜单项分组后放入一个

标签中,并将其嵌入欲与子菜单关联的Action项中。让我们假定,你需要创建Create和Update两个Action项。当用户点击Create项时,将会弹出一个子菜单,显示3个子菜单项Create Invoice、Create Customer和 Create Product。为了理解如何定义Action项的子菜单,请新建一个名为ActionBarSubmenu的Android项目。要创建Action项Create和Update,以及Create项中的子菜单,请把代码清单3-6中给出的代码写入菜单文件activity_action_bar_submenu.xml中,此文件位于/res/menu文件夹下。

代码清单3-6 写入菜单文件activity_action_bar_submenu.xml的代码

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/create"
        android:title="Create"
        android:orderInCategory="0"
        android:showAsAction="ifRoom" >
        <menu>
            <item android:id="@+id/create_invoice"
                android:title="Create Invoice" />
            <item android:id="@+id/create_customer"
                android:title="Create Customer" />
            <item android:id="@+id/create_product"
                android:title="Create Product" />
        </menu>
    </item>
        <item android:id="@+id/update"
        android:title="Update"
        android:showAsAction="always" />
</menu>

可以看到,上述代码包括了android:showAsAction属性,空间足够时将显示ActionBar中的菜单项。Action项Create中的

元素定义了包含三个菜单项的子菜单:Create Invoice、Create Customer和Create Product。

为了把点击Action或菜单项之后的反馈信息显示出来,需要在Layout文件activity_ action_bar_submenu.xml中定义一个TextView控件。TextView将会显示文字,标示是哪个Action菜单或Action项被选中了。定义完TextView控件后,Layout文件activity_ action_bar_submenu.xml应该如代码清单3-7所示。

代码清单 3-7 写入Layout 文件activity_action_bar_submenu.xml的代码

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/selectedopt"
        android:textSize="@dimen/text_size"
        android:textStyle="bold" />
</LinearLayout>

为了在Java代码中标识TextView,它的ID被赋为selectedopt。通过TextView控件显示的文字将会以粗体显示、字体大小为18dp。为了把点击菜单或Action项之后的反馈信息显示出来,请修改ActionBarSubmenuActivity.java,如代码清单3-8所示。其中的代码会显示文字信息,标示是哪个菜单或Action项被选中了。

代码清单3-8 写入Java Activity文件ActionBarSubmenuActivity.java的代码

package com.androidtablet.actionbarsubmenu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class ActionBarSubmenuActivity extends Activity {
    private TextView selectedOpt;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_action_bar_submenu);
        selectedOpt=(TextView)findViewById(R.id.selectedopt);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_action_bar_submenu, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.create:
                selectedOpt.setText("You have selected Create
                    option");
                break;
            case R.id.update:
                selectedOpt.setText("You have selected Update option");
                break;
            case R.id.create_invoice:
                selectedOpt.setText("You have selected Create
                    Invoice option");
                break;
            case R.id.create_customer:
                selectedOpt.setText("You have selected Create
                    Customer option");
                break;
            case R.id.create_product:
                selectedOpt.setText("You have selected Create
                    Product option");
                break;
        }
        return true;
    }
}

为了显示ActionBar,把菜单文件activity_action_bar_submenu.xml中定义的菜单装载或整合进来。这样,从Activity类得到了MenuInflater。对象inflater创建自MenuInflater类,它调用inflater的inflate方法来装载或融合在activity_action_ bar_submenu中定义的菜单。onCreateOptionsMenu()方法将会返回布尔值True,以便让Android显示菜单。

所有被点击的菜单或Action项都会通过onOptionsItemSelected()方法进行处理。选中的菜单或Action项将会作为参数MenuItem传入此方法。可以在Activity中重写此方法,写入点击菜单或Action项后需要执行的代码。在此方法中,读取了所选菜单或Action项的ID,然后执行相应的动作。getItemId()方法将帮助你查找所选菜单或Action项的ID。然后,通过switch语句,把标示所选菜单或Action项的文字信息显示在TextView对象selectedOpt中。

运行此应用程序后,会看到显示在ActionBar 中的Action项Create和Update(见图3-6上)。点击Action项Create后,TextView将会显示信息“You have selected Create option”。点击Action项Create后将会出现一个子菜单,如图3-6中所示。在选择子菜单项后,相应的文字信息将会通过TextView显示出来。例如,选择子菜单项Create Customer后,将会显示文字信息“You have selected Create Customer option”,如图3-6下所示。


367f071d89768152d6960730aa7dfa1893e638bb

要建立可勾选的菜单项,请把android:checkable属性设为布尔值True。比如,要让子菜单项Create Product成为可勾选项(见图3-6中),可以写入以下代码:

<item android:id="@+id/create_product"
    android:title="Create Product"
    android:checkable="true" />
..\jpgs\03fig06.jpg

图3-6 应用程序启动时显示的两个Action项目(上),点击Action项Create后弹
出的子菜单(中),显示哪个子菜单项被选中的TextView控件(下)

这段代码将会让Create Product显示为可勾选的菜单项(参见图3-7上)。

还可以让菜单项显示为单选按钮。也就是说,可以让用户选择一组菜单项中的某一个。一旦选中了某一个,以前选中的菜单项将自动取消。

为了理解单选按钮的概念,请在Action项Update下添加一组互斥的菜单项。这组菜单项显示为Update Code、Update Name和Update Price。这些菜单项将显示为单选按钮,因此其中只有一个菜单项能被选中。当选中了一个菜单项时,之前所选的菜单项都将会自动取消选中。为了把一组互斥的菜单项加入到Action项Update中,请把菜单文件activity_action_bar_ submenu.xml修改如代码清单3-9所示。

代码清单3-9 写入菜单文件activity_action_bar_submenu.xml的代码

<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/create"
        android:title="Create"
        android:orderInCategory="0"
        android:showAsAction="ifRoom|withText" >
        <menu>
            <item android:id="@+id/create_invoice"
                android:title="Create Invoice" />
            <item android:id="@+id/create_customer"
                android:title="Create Customer" />
            <item android:id="@+id/create_product"
                android:title="Create Product"
                android:checkable="true" />
        </menu>
    </item>
    <item android:id="@+id/update"
        android:title="Update"
        android:showAsAction="always" >
        <menu>
            <group android:checkableBehavior="single">
                <item android:id="@+id/update_code"
                    android:title="Update Code"
                    android:checked="true" />
                <item android:id="@+id/update_name"
                    android:title="Update Name" />
                <item android:id="@+id/update_price"
                    android:title="Update Price" />
            </group>
        </menu>
    </item>
</menu>

可以看到,菜单项嵌套在元素中,android:checkableBehavior=single属性与该组关联,确保菜单组中每次只能选中一个菜单项。由此,Update Code、Update Name、Update Price菜单项将会显示为单选按钮。为了知道选中了哪个单选按钮,请把代码清单3-10给出的代码写入ActionBarSubmenuActivity.java文件。只有以粗体显示的代码是新添加的,其余部分与代码清单3-8一致。

代码清单3-10 写入Java Activity 文件ActionBarSubmenuActivity.java的代码

package com.androidtablet.actionbarsubmenu;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class ActionBarSubmenuActivity extends Activity {
    private TextView selectedOpt;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_action_bar_submenu);
        selectedOpt=(TextView)findViewById(R.id.selectedopt);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.activity_action_bar_submenu, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.create:
                selectedOpt.setText("You have selected Create
                    option");
                break;
            case R.id.update:
                selectedOpt.setText("You have selected Update
                    option");
                break;
            case R.id.create_invoice:
                selectedOpt.setText("You have selected Create
                    Invoice option");
                break;
            case R.id.create_customer:
                selectedOpt.setText("You have selected Create
                    Customer option");
                break;
            case R.id.create_product:
                selectedOpt.setText("You have selected Create
                    Product option");
                break;
case R.id.update_code:
                selectedOpt.setText("You have selected Update
                    Code option");
                break;
            case R.id.update_name:
                selectedOpt.setText("You have selected Update
                    Name option");
                break;
            case R.id.update_price:
                selectedOpt.setText("You have selected Update
                    Price option");
                break;
        }
        return true;
    }
}

运行此应用程序后,选择Action项Update,将会出现一个子菜单,菜单项Update Code、Update Name和Update Price将以单选按钮方式显示。当选中菜单项时,任何以前选中的菜单项将会取消,对应的文字信息将会由TextView显示出来。例如,当你点击子菜单中的Update Code菜单项时,将会显示文字信息“You have selected Update Code”,如图3-7下所示。


c2c6fb9d60d60f6a3c60a8b9d9e22c398e084837
相关文章
|
21天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
12天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
14天前
|
Java Android开发
Android开发之使用OpenGL实现翻书动画
本文讲述了如何使用OpenGL实现更平滑、逼真的电子书翻页动画,以解决传统贝塞尔曲线方法存在的卡顿和阴影问题。作者分享了一个改造后的外国代码示例,提供了从前往后和从后往前的翻页效果动图。文章附带了`GlTurnActivity`的Java代码片段,展示如何加载和显示书籍图片。完整工程代码可在作者的GitHub找到:https://github.com/aqi00/note/tree/master/ExmOpenGL。
19 1
Android开发之使用OpenGL实现翻书动画
|
14天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
12 1
Android开发之OpenGL的画笔工具GL10
|
21天前
|
Android开发
Android开发小技巧:怎样在 textview 前面加上一个小图标。
Android开发小技巧:怎样在 textview 前面加上一个小图标。
12 0
|
21天前
|
Android开发
Android 开发 pickerview 自定义选择器
Android 开发 pickerview 自定义选择器
12 0
|
27天前
|
Java Android开发
Android开发系列全套课程
本系列课程面向有java基础,想进入企业从事android开发的计算机专业者。学习搭配实战案例,高效掌握岗位知识。
18 1
|
3月前
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
143 1
|
3月前
|
SQL API Android开发
展望2022:Android 开发最新技术动向
展望2022:Android 开发最新技术动向
108 0
展望2022:Android 开发最新技术动向
|
SQL XML Java
展望2022:Android 开发最新技术动向
今年的 Android Dev Summit 在线上如期举行,在活动上 Google 的技术专家们会分享一些 Android 领域的技术动向以及开发心得。本文做一个全面盘点
2105 0