`
huaxin803
  • 浏览: 113291 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 用户界面---菜单(Menus 一)

 
阅读更多

在很多类型的应用程序中,菜单是一个常用的用户界面组件。要提供友好的和前后一致的用户体验,就应该使用Menu APIs把Activity的动作和其他选项展现给用户。

从Android3.0(API 级别 11)开始,Android设备不再需要提供一个专用的Menu按钮,随着这种改变,Android应用程序将会从对传统的6项菜单面板的依赖中解脱出来,取而代之的是提供了一个用户展现常用用户动作的操作栏。

尽管针对一些菜单项的设计和用户体验已经改变,但是定义一组动作和选项的语意依然是基于Menu APIs的。本指南展示了如何创建能够在Android所有版本上演示的三种基本类型的菜单和动作。

选项菜单和操作栏

选项菜单(options menu)是针对Activity的主要菜单集合。它是你放置应用程序中有全局影响的动作的地方,如“搜索”、“编写电子邮件”、和“设置”等功能。

如果你针对Android2.3或更低的版本来开发应用,那么用户要通过按Menu按钮来展现选项菜单面板。

在Android3.0或更高版本上,源于选项菜单的项目是通过操作栏(action bar)来展现的,它由屏幕上的动作项目和剩余的选项组合而成。从Android3.0开始,Menu按钮被弃用了(有些设备根本就没有这个按钮),因此,你应该使用操作栏来提供对动作和其他选项的访问。

上下菜单和上下文操作模式

一个上下文菜单是一个当用户在一个元素上执行long-click事件时才显示的浮动菜单。它提供了影响选择内容或上下文框架的动作。

当给Android3.0和更高的版本开发应用程序时,你应该改用上下文动作模式(contextual action mode)来确保被选内容的动作。这种模式把影响选择内容的动作项目显示在屏幕顶部的一个横条中,并允许用户选择多个项目。

弹出菜单

一个弹出菜单在一个垂直列表中显示项目的列表,它靠在调用这个菜单的View对象旁边。它对给相关指定内容提供动作的展现或给一个命令的第二部分提供选项是有好处的。弹出菜单中的动作不应该直接影响对应的内容,相反,弹出菜单是为了扩展Activity中相关内容区域的动作而设计的。

在XML中定义一个菜单

对于所有的菜单类型,Android提供了标准的XML格式来定义菜单项目。你应该在一个XML菜单资源中定义一个菜单和它的所有的项目,而不是在你Activity代码中创建一个菜单。然后你就能够把菜单资源作为一个Menu对象加载到Activity或Fragment对象中。

由于以下原因,使得使用菜单资源是一个好的选择:

1.更容易看清XML文件中的菜单结构;

2.它把针对菜单的内容和应用程序的行为代码给分离开了;

3.它允许你针对不同的平台版本、屏幕尺寸和其他的被应用资源框架利用的配置来创建可选的菜单配置。

要定义菜单,就要在你的项目内部的res/menu/目录内部创建一个XML文件,并且要使用下列元素来构建菜单:

<menu>

定义一个菜单,它包含菜单项。<menu>元素必须是这个文件的根节点,并且能够拥有多个<item>和<group>元素。

<item>

创建一个MenuItem对象,它代表了一个菜单中的单独项目。为了创建一个子菜单,这个元素可以包含一个嵌套的<menu>元素。

<group>

一个可选的针对<item>元素的非可见容器。它允许把菜单项分类,以便它们共享诸如活动状态和可见性等属性。

以下是一个名叫game_menu.xml的菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:icon="@drawable/ic_new_game"
          android:title="@string/new_game"
          android:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>

<item>元素支持以下几个用于定义菜单项的外观和行为的属性:

android:id

菜单项的唯一资源ID,在用户选择这个菜单项时,应用程序能够用这个ID来识别它。

android:icon

指向一个可描画的资源,用作这个菜单项的图标。

android:title

指向一个用作菜单标题的字符串。

android:showAsAction

指明这个菜单项作为操作栏(action bar)中的一个动作项应该显示的时机和方式。

以上只是你应该使用的最重要的属性,但是还有一些有效的属性。有关菜单支持的所有属性信息,请看“菜单资源”的文档。

你能够给菜单中的任意一个项目(子菜单除外)添加一个子菜单,通过把<menu>元素作为<item>元素的一个子元素方式来添加。当应用程序中有很多能够被组织到一个专题中的功能时,子菜单是有益的,就像PC应用程序的菜单栏中的项目(File、Edit、View等)一样,如:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file"
          android:title="@string/file" >
        <!-- "file" submenu -->
        <menu>
            <item android:id="@+id/create_new"
                  android:title="@string/create_new" />
            <item android:id="@+id/open"
                  android:title="@string/open" />
        </menu>
    </item>
</menu>

要在Activity中使用菜单,你需要使用MenuInflater.inflate()方法来加载菜单资源(把XML资源转换成可编程对象)。在下列章节中,你会看到每种类型菜单的创建方法。

创建一个选项菜单

选项菜单应该是包含动作和与当前Activity上下文环境相关的其他选项,如:“搜索”、“编写电子邮件”、和“设置”等。

选项菜单中项目在屏幕上显示的位置依赖与你的应用程序所依赖的Android平台版本:

1.如果你的应用程序依赖Android2.3.x(API 级别 10)或更低的版本,那么当用户按下Menu按钮时,你的选项菜单内容会显示在屏幕的底部,如图1所示:当菜单被打开时,首先看到的是图标菜单,它们被六个菜单项持有。如果你的菜单包含的菜单项目大于6,那么Adroid会放入第六个项目并把其余的项目放到溢出菜单中,用户能够同选择更多的菜单项来打开其余的菜单项。

pic

图1.Android2.3上的浏览器的可选菜单

2.如果你的应用程序依赖Android3.0(API 级别 11)或更高的版本,可先菜单的项目在操作栏(action bar)中是有效的。默认情况下,系统会把所有的项目放到动作溢出中,用户能够在操作栏(action bar)的右边看到动作溢出图标(或者,如果Menu按钮有效,按下设备的Menu按钮也可以)。要让重要的动作快速访问,你能够通过在<item>元素中添加android:showAsAction=”ifRoom”属性设置,把一些菜单项目放到操作栏中显示。

注意:即使你的应用不依赖Android3.0或更高的版本,你也能够构建自己的操作栏(action bar)来模仿类似的效果。

pic

图2.Honeycomb Gallery应用程序的操作栏,显示了导航标签和照相机动作项(被加在动作溢出按钮上)

Honeycomb Gallery应用程序网址:

http://developer.android.com/resources/samples/HoneycombGallery/index.html

你既可以给Activity子类,也可以给Fragment子类声明选项菜单项目。如果Activity和Fragment都声明了选项菜单项目,它们会在UI中组合到一起。Activity的选项菜单会首先显示,紧接着按照每个Fragmeng被添加的顺序来显示Fragment的选项菜单。如果需要,你能够在每个需要移动的<item>元素中用android:orderInCategory属性来重新指定选项菜单的顺序。

要给一个Activity指定选项菜单,需要重写onCreateOptionsMenu()方法(Fragment也提供它们自己的onCreateOptionsMenu()方法)。在这个方法中,能够把菜单资源(在XML文件中定义)加载到这个回调方法提供的Menu对象中。如:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.game_menu, menu);
    return true;
}

你也能够使用add()方法来添加菜单项,并且用findItem()方法获取要用MenuItem APIs修改属性的菜单项。

如果你的应用程序依赖Android2.3.x或更低的版本,系统会在用户首次打开这个菜单时,调用onCreateOptionsMenu()方法来创建选项菜单。如果你的应用程序依赖Android3.0或更高的版本,系统会在启动Activity时调用onCreateOptionsMenu()方法,以便把选项菜单显示在操作栏(action bar)中。

处理click事件

当用户选择了选项菜单中的一个菜单项(包括操作栏(action bar)中动作),系统会调用Activity的onOptionsItemSelected()方法。这个方法把选择的菜单项作为参数来传递。你能够通过调用getItemId()方法来识别菜单项,这个方法返回了对象菜单项的唯一ID(这个ID是在菜单资源的android:id属性中定义的,或者是传递给add方法的一个整数)。你能够把这个ID与已知的菜单项匹配,让它执行对应的动作,如:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.new_game:
            newGame();
            return true;
        case R.id.help:
            showHelp();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

当你成功的处理了一个菜单项时,就返回true。如果你没有处理菜单项,你应该调用父类的onOptionsItemSelected()方法实现(默认的实现返回false)。

如果你Activity包括Fragment,那么系统会首先调用Activity的onOptionsItemSelected()方法,然后会调用每个Fragment的onOptionsItemSelected()方法(按照每个Fragment被添加的顺序),直到其中的一个返回true,或所有Fragment的onOptionsItemSelected()方法都被调用。

提示:Android3.0使用android:onClick属性添加了在XML文件中给菜单项定义on-click行为的能力。这个属性值必须是Activity定义的使用菜单的一个方法名。这个方法必须是公共的,并且要接收一个单一的MenuItem对象参数---当系统调用这个方法时,会用它来传递被选择的菜单项。更多的信息和示例,请看“菜单资源”文档。

提示:如果你的应用程序包含了多个Activity,并且其中的一些Activity都提供了相同的选项菜单,可以考虑创建一个除onCreateOptionsMenu()和onOptionItemSelected()方法以外没有任何其他实现的Activity类,然后,每个Activity都继承这个Activity,这样就实现了相同选项菜单的共享。这种方法,你能够只管理一组处理菜单动作的代码,并且每个子类都会继承这个菜单行为。如果你想要给这个Activity子类添加菜单项,重写那个Activity的onCreateOptionsMenu()方法就可以了,在用menu.add()方法添加新的菜单项时,要调用super.onCreateOptionsMenu(menu)方法,以便初始菜单项被创建。你也能够给独立的菜单项重写其父类的行为。

在运行时改变菜单项

系统调用onCreateOptionsMenu()方法以后,它会保留你组装的这个菜单的一个实例。除非这个菜单对某些屏幕是无效的,否则系统不会再次调用onCreateOptionsMenu()方法。因此,你应该仅在创建初始菜单状态时使用onCreateOptionsMenu()方法,并且在Activity的生命周期内不使它发生改变。

如果你想要基于Activity生命周期期间发生的事件来修改选项菜单,那么你可以在onPrepareOptionsMenu()方法中来做这件事。这个方法把当前存在的Menu对象传递给你,以便你能够修改它,如添加、删除、或禁用菜单项。(Fragment也提供一个onPrepareOptionsMenu()回调方法。)

在Android2.3.x和更低版本上,每次用户打开选项菜单(按下Menu按钮)时,系统都会调用onPrepareOptionsMenu()方法。

在Android3.0和更高的版本上,当菜单项在操作栏(action bar)中展现的时候,选项菜单被认为是始终打开的。当一个事件发生,并且你要执行一个菜单更新的动作时,你必须调用invalidateOptionMenu()方法来请求系统调用onPrepareOptionsMenu()方法。

注意:你永远都不会基于当前焦点中的View对象来改变选项菜单的项目。当在触屏模式中,View对象不需要焦点,因此你永远不会使用焦点作为修改选项菜单中菜单项的基础。如果想要给一个View对象提供一个上下文敏感的菜单,请使用上下文菜单。

分享到:
评论

相关推荐

    【Android开发API】用户界面-菜单-Menus.pdf

    在Android开发中,菜单是用户界面的重要组成部分,用于呈现用户可执行的操作和应用中的其他功能。自Android 3.0(API级别11)开始,系统不再强制要求物理菜单键,而是提倡使用动作条来展示主要操作,以提供更一致且...

    Android教程04-用户界面.ppt

    【Android用户界面设计详解】 Android用户界面是应用程序与用户交互的核心部分,良好的用户界面设计能够提升用户体验,增强应用的吸引力。本教程将深入探讨Android用户界面的各个方面。 首先,我们来了解一下用户...

    Android教程04-用户界面开发

    Android用户界面开发是构建Android应用程序的核心部分,对于初学者来说,理解和掌握这一领域至关重要。在本教程中,我们将深入探讨以下几个关键知识点: 1. **布局(Layout)**:Android提供了多种布局类型,如...

    android-tabs-menus

    Tab布局是Android用户界面设计中常见的一种模式,它允许用户通过切换不同的标签来浏览和操作不同的内容区域。这里我们将深入探讨如何在Android应用中实现这种功能,以及与之相关的Java编程知识。 首先,我们需要...

    android 葵花宝典

    2. **第四章:用户界面**(Android-Chapter04-User-Interfaces.pdf): 用户界面是应用与用户交互的关键。本章详细介绍如何使用XML布局文件创建用户界面,包括各种控件的使用、布局管理器的原理,以及如何动态地...

    浙大讲义:Android用户界面.rar

    这份"浙大讲义:Android用户界面.rar"压缩包包含了一份浙江大学关于Android UI设计的课程资料,主要涵盖了以下几个方面: 1. **布局(Layout)**:在Android中,布局是组织和定位UI元素的方式。常见的布局有...

    Android menu单选菜单.rar

    在Android应用开发中,Menu是用户界面中的一个重要组成部分,它提供了在特定时刻向用户展示一组操作选项的功能。在本教程中,我们将深入探讨如何在Android应用中创建和使用单选菜单(Radio Menus)。这份"Android ...

    Android二级菜单

    在Android应用开发中,二级菜单是一种常见的用户界面设计,它为用户提供更丰富的导航体验,尤其在内容层次较多或功能复杂的应用中。二级菜单通常由一个主菜单和与之相关的子菜单构成,用户点击主菜单项后,子菜单会...

    Android开发指南中文版.doc

    - Android用户界面是由多个视图(View)组成的层次结构。 - 使用XML布局文件定义用户界面。 - **布局 - Layouts**: - 常见的布局包括LinearLayout、RelativeLayout等。 - 可以嵌套布局以创建复杂的用户界面。 -...

    Android开发指南中文版-----应用程序框架

    菜单是用户界面的一个重要组成部分,可以用来提供选项和命令。Android支持创建上下文菜单和选项菜单。 #### 十、高级话题(Advanced Topics) 除了基本的用户界面构建之外,Android还提供了一些高级特性来帮助开发者...

    Android_Menus测试代码

    在Android应用开发中,菜单(Menu)是用户界面不可或缺的一部分,它提供了用户操作的主要入口点。本篇文章将深入探讨如何创建和测试Android菜单,主要基于提供的链接:...

    android_ 9ppt (吉林大学android课程英文讲义)

    吉林大学提供的这份英文讲义,详细介绍了Android平台中使用菜单(Menus)的相关知识点,对于深入理解Android用户界面设计与交互提供了宝贵的资料。 根据提供的讲义内容,我们可以了解到Android中菜单的基本类型以及...

    Android开发入门书籍

    **2.10 应用菜单(Chapter 16: Applying Menus)** - **知识点:** - 创建菜单 - 处理菜单事件 - 上下文菜单与选项菜单 **2.11 显示弹出消息(Chapter 17: Showing Pop-Up Messages)** - **知识点:** - ...

    Android 滑动提示、菜单及列表等小程序源码

    在Android开发中,滑动提示、菜单以及列表是构建用户界面不可或缺的部分,这些元素极大地提升了应用的交互性和用户体验。下面将详细阐述这三个方面的知识点,并结合源码分析来深入理解其工作原理。 1. **滑动提示...

Global site tag (gtag.js) - Google Analytics