《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
相关文章
|
5天前
|
开发工具 Android开发 iOS开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座般耀眼,各自拥有独特的开发生态和用户群体。本文将深入分析这两个平台的显著差异,从技术架构到开发工具,再到市场定位,揭示它们之间的异同。通过比较,我们不仅能够更好地理解各自的优势和局限,还能洞察未来移动应用开发的趋势。
|
1天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
32 15
|
1天前
|
存储 API Android开发
kotlin开发安卓app,使用webivew 触发 onShowFileChooser, 但只能触发一次,第二次无法触发,是怎么回事。 如何解决
在Android WebView开发中,`onShowFileChooser`方法用于开启文件选择。当用户只能选择一次文件可能是因为未正确处理选择回调。解决此问题需确保:1) 实现`WebChromeClient`并覆写`onShowFileChooser`;2) 用户选择文件后调用`ValueCallback.onReceiveValue`传递URI;3) 传递结果后将`ValueCallback`设为`null`以允许再次选择。下面是一个Kotlin示例,展示如何处理文件选择和结果回调。别忘了在Android 6.0+动态请求存储权限,以及在Android 10+处理分区存储。
|
3天前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
6天前
|
开发者 Kotlin Android开发
Kotlin协程在Android开发中的应用
【7月更文挑战第10天】Kotlin协程简化了Android异步编程,提供轻量级并发。挂起函数让异步代码看起来同步,不阻塞线程,便于管理。在项目中,添加Kotlin和协程依赖,如`kotlinx.coroutines-core`和`kotlinx-coroutines-android`。使用`CoroutineScope`和`launch`处理耗时任务,如网络请求,避免主线程阻塞。挂起函数和调度器控制执行上下文,适应不同任务需求。
|
5天前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台各领风骚。本文将深入探讨这两个平台的开发差异,从编程语言、用户界面设计到开发工具等方面进行比较,并分析开发者面临的挑战。通过对比分析,旨在为开发者提供一个全面的视角,帮助他们更好地选择适合自己项目需求的开发平台。
10 0
|
7天前
|
搜索推荐 Android开发 iOS开发
探索Android与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第9天】在移动应用开发的浩瀚海洋中,Android和iOS两大操作系统如同两座灯塔,指引着开发者们的航向。本文将深入探讨这两个平台在开发环境、用户界面设计、性能优化以及市场策略上的根本差异。我们将通过比较分析,揭示各自平台的独特优势和潜在挑战,为开发者提供决策支持,同时也为用户体验的提升指明方向。
|
18天前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
Android开发
Android 2.x中使用actionbar - Actionbarsherlock
1. 范例说明 从Android 3.0开始,Android引入了ActoinBar,不得不说3.0之前android的标题栏确实比较丑,并且还没有任何功能。 之前很多应用的顶部栏很多都是仿苹果的,比如微信。
1008 0
|
Java Android开发
Android 2.x中使用actionbar - Actionbarsherlock (2)
先前有一个项目,是基于android4.0来开发,使用到了Fragment及ActionBar,没打算支持android2.1-android2.3系列版本 写完之后,我将此应用发布到百度应用,一天以后,收到百度测试员反馈的信息:由于运行时出现"强制关闭错误",此应用未上架,当时一看,我猜想应该是由于2.
935 0