android用户界面-菜单

简介:

创建菜单 Creating Menus

Android提供了三种基础菜单类型:

选项菜单Options Menu

这是一个活动的主菜单。通过按下设备菜单键来显示它。选项菜单包含两组菜单项:

图标菜单Icon Menu

这个是当用户按下菜单键时最初出现屏幕下方的item集合。它支持最多6个菜单项。只有这些菜单支持图标而且这些菜单并不支持checkboxes或者radio buttons。

扩展菜单Expanded Menu

这是通过按“更多”菜单显现出来的一个竖向的项目列表。它仅当图标菜单过多时存在而且是由6个以及其它选项菜单组成。

上下文菜单Context Menu

这是一个浮动菜单列表,通常在你长时间按在一个视图上时出现(比如一个列表项)

子菜单Submenu

这是一个浮动菜单列表,通过在选项菜单或上下文菜单选择菜单项显露出来。不支持嵌套子菜单。

 

选项菜单Options Menu
这个选项菜单通过按设备菜单键打开。打开后,出现图标菜单,可包含6个菜单项。如果添加多于6个菜单项,多出的部分将通过“更多”菜单项在扩展菜单中显示。扩展菜单项在多于6个菜单项时自动添加。

选项菜单应该包含应用程序的基本功能以及任何必要的浏览项(例如,返回桌面或应用程序设置)。你还可以通过增加子菜单Submenus来组织主题和包含额外的菜单功能。

当菜单第一次被打开时,系统会调用活动onCreateOptionsMenu()回调函数。重写该方法并生成传递给你的这个菜单对象。你可以通过扩充定义在XML文件中的一个菜单资源或者通过为你想要的每一个菜单项调用add()方法生成这个菜单。这个方法增加一个菜单项MenuItem,并返回新创建的对象。你可以用返回的MenuItem来设置附加属性如图标,快捷键,意图以及这个菜单项的其它设置。

有多个add()方法。通常,你会使用接受一个itemId参数的那个。这是一个唯一的整数,允许你在回调函数中识别这个item。

当一个菜单项从选项菜单中被选择时,你会接收到一个onOptionsItemSelected()回调。这个回调传给你选中的MenuItem。你可以通过请求itemId:getItemId()来识别它,这将返回add()方法分配的整数。一旦你识别了这个菜单项,就可以采取合适的动作。

下面是一个活动里的例子,其中我们创建了一个选项菜单并处理菜单项的选择:

Java代码

 

/* Creates the menu items */

public boolean onCreateOptionsMenu(Menu menu)

{

menu.add(0, MENU_NEW_GAME, 0"New Game");

menu.add(0, MENU_QUIT, 0"Quit");

return true;

}

/* Handles item selections */

public boolean onOptionsItemSelected(MenuItem item)

{

switch (item.getItemId())

{

case MENU_NEW_GAME: newGame(); return true;

case MENU_QUIT: quit(); return true;

}

return false;

}

  1. 这个add()方法有四个参数:groupId, itemId, order, 和 title。groupId 允许你关联这个菜单到一个菜单组中(更多参见下面的菜单组Menu groups)-这个例中,我们忽略掉它。itemId是用来识别菜单项的唯一的整数,在回调函数中使用。order 允许我们定义菜单的显示顺序-缺省情况下,它们以添加时的顺序排列。title当然是菜单的名字(可以是一个字符串资源,为了本地化更加方便,建议你使用资源)。

提示: 如果你有一些可以以一个标题归类的菜单项,考虑以子菜单Submenu的方式组织它们。

增加图标Adding icons

图标也可以通过setIcon()函数被添加到菜单项中。

Java代码
  1. menu.add(0, MENU_QUIT, 0"Quit") .setIcon(R.drawable.menu_quit_icon);

修改菜单Modifying the menu

如果有些时候你想在选项菜单被打开的时候re-write它,可以override onPrepareOptionsMenu()方法,该方法在每一次菜单被打开的时候调用。它将传递给你菜单对象,就像回调一样。这对于根据应用程序状态调整菜单选项很有用。

注意: 当改变菜单项时,根据当前选择的item来这样做是一个不好的行为。记住,在触摸模式中,将不会有一个选择或聚焦的item。相反,当你想基于UI中的某个特定item来提供功能时,你应该使用一个Context Menu 来完成这种行为。

实例:

/Chapter04_UI_Menu01/src/com/amaker/test/MainActivity.java

 

 
  1. 代码  
  2.  
  3. package com.amaker.test;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.view.Menu;  
  7. import android.view.MenuItem;  
  8. /**  
  9.  *   
  10.  * 选项菜单实例  
  11.  */ 
  12. public class MainActivity extends Activity {  
  13.       
  14.     private static final int ITEM1 = Menu.FIRST;  
  15.     private static final int ITEM2 = Menu.FIRST+1;  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.     }  
  20.  
  21.     /**  
  22.      * 覆盖该方法添加菜单项  
  23.      */ 
  24.     public boolean onCreateOptionsMenu(Menu menu) {  
  25.         menu.add(0, ITEM1, 0"开始");  
  26.         menu.add(0, ITEM2, 0"退出");  
  27.         return true;  
  28.     }  
  29.       
  30.     /**  
  31.      * 覆盖该方法,响应菜单选项被单击事件  
  32.      */ 
  33.     public boolean onOptionsItemSelected(MenuItem item) {  
  34.         switch (item.getItemId()) {  
  35.         case ITEM1:  
  36.             setTitle("开始游戏!");  
  37.             break;  
  38.         case ITEM2:  
  39.             setTitle("退出!");  
  40.             break;  
  41.         }  
  42.         return true;  
  43.     }  

上下文菜单Context Menu

 

Android的上下文菜单在概念上和PC软件的右键菜单类似。当一个视图注册到一个上下文菜单时,执行一个在该对象上的“长按”(按住不动差不多两秒钟)动作,将出现一个提供相关功能的浮动菜单。上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图ListView的item,在按中列表项时,会转换其背景色而提示将呈现上下文菜单。 (电话联系人列表提供了关于这个特性的一个很好的例子)。

注意:上下文菜单项不支持图标或快捷键。

为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和onContextItemSelected()。在回调函数onCreateContextMenu()里,你可以通过使用一个add()方法来添加菜单项,或者通过扩充一个定义在XML中的菜单资源。然后,通过registerForContextMenu()为这个视图注册一个上下文菜单ContextMenu.

比如,下面的代码可以被用到Notepad应用程序中来为列表中的每一个注释添加一个上下文菜单:

Java代码

public void onCreateContextMen(ContextMenu menu, View v, ContextMenuInfo menuInfo)

{

super.onCreateContextMenu(menu, v, menuInfo);

menu.add(0, EDIT_ID, 0"Edit");

menu.add(0, DELETE_ID, 0"Delete");

}

public boolean onContextItemSelected(MenuItem item)

{

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

switch (item.getItemId()) {

case EDIT_ID: editNote(info.id); return true;

case DELETE_ID: deleteNote(info.id); return true;

defaultreturn super.onContextItemSelected(item);

}

}

在onCreateContextMenu()中,除了给出将添加MenuItems的ContextMenu外,还需要给定选中的视图和一个上下文菜单信息ContextMenuInfo对象,该对象提供了选中对象的附加信息。在本例中,onCreateContextMenu()没做什么特别的事-只是添加了一些菜单项。在onContextItemSelected() 回调函数中,我们从MenuItem中请求AdapterContextMenuInfo,该对象提供当前选中项的信息。我们从中所要的只是这个选中项的列表ID,所以无论编辑还是删除一个注释,我们通过这个对象的AdapterContextMenuInfo.info字段来找到该ID。这个ID被传递给editNote() 和deleteNote()方法来执行相应的动作。

现在,要为一个列表视图中的所有项注册上下文菜单,我们可以传递整个的列表视图对象给registerForContextMenu(View) 方法:

Java代码
  1. registerForContextMenu(getListView());

记住,你可以传递任何视图对象来注册一个上下文菜单。这里,getListView()返回这个被用于Notepad应用程序的列表活动ListActivity中的列表视图对象。这样,这个列表中的任何item都被注册到这个上下文菜单。

 

 

 
  1. 代码  
  2.  
  3. package com.amaker.test;  
  4. import android.app.Activity;  
  5. import android.graphics.Color;  
  6. import android.os.Bundle;  
  7. import android.view.ContextMenu;  
  8. import android.view.Menu;  
  9. import android.view.MenuItem;  
  10. import android.view.View;  
  11. import android.view.ContextMenu.ContextMenuInfo;  
  12. import android.widget.TextView;  
  13.  
  14. /**  
  15.  *   
  16.  * @author 测试上下文菜单,改变背景色  
  17.  */ 
  18. public class MainActivity extends Activity {  
  19.     private static final int ITME1 = Menu.FIRST;  
  20.     private static final int ITME2 = Menu.FIRST+1;  
  21.     private static final int ITME3 = Menu.FIRST+2;  
  22.     private TextView myTV;  
  23.       
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         setContentView(R.layout.main);  
  27.         myTV = (TextView)findViewById(R.id.TextView01);  
  28.         registerForContextMenu(myTV);  
  29.     }  
  30.  
  31.     @Override 
  32.     public void onCreateContextMenu(ContextMenu menu, View v,  
  33.             ContextMenuInfo menuInfo) {  
  34.         menu.add(0, ITME1, 0"红色背景");  
  35.         menu.add(0, ITME2, 0"绿色背景");  
  36.         menu.add(0, ITME3, 0"白色背景");  
  37.     }  
  38.       
  39.     @Override 
  40.     public boolean onContextItemSelected(MenuItem item) {  
  41.         switch (item.getItemId()) {  
  42.         case ITME1:  
  43.             myTV.setBackgroundColor(Color.RED);  
  44.             break;  
  45.         case ITME2:  
  46.             myTV.setBackgroundColor(Color.GREEN);  
  47.             break;  
  48.         case ITME3:  
  49.             myTV.setBackgroundColor(Color.WHITE);  
  50.             break;  
  51.         }  
  52.         return true;  
  53.     }  

子菜单Submenus

 

一个子菜单可以被添加进任何菜单中,但不能加入另外的子菜单中。当你的应用程序有很多功能可以按主题组织的时候,这将非常有用,就好比PC应用程序的菜单栏(文件,编辑,视图,等)。

子菜单通过addSubMenu()加入到已有的菜单中而创建。该函数会返回一个子菜单SubMenu对象(菜单Menu的一个扩展)。然后你可以通过调用add()方法给这个菜单添加其他项,例如:

Java代码

public boolean onCreateOptionsMenu(Menu menu)

{

boolean result = super.onCreateOptionsMenu(menu);

SubMenu fileMenu = menu.addSubMenu("File");

SubMenu editMenu = menu.addSubMenu("Edit");

fileMenu.add("new");

fileMenu.add("open");

fileMenu.add("save");

editMenu.add("undo");

editMenu.add("redo");

return result;

}

子菜单中选择项的回调动作将由父菜单的回调方法处理。比如上面的例子,子菜单中的选择将由onOptionsItemSelected() 回调处理。

你也可以在XML中定义父菜单时增加子菜单。

 

在XML里定义菜单Define Menus in XML

 

就像Android用户界面布局一样,你可以在XML文件中定义菜单,然后在你菜单的onCreate...()回调函数中扩充它们。这使得你的应用程序代码简洁而且把更多的界面设计分离到XML文件中,这更容易形象化。

首先,在你的工程res/的目录下创建一个新的目录叫menu。你所有定义应用程序菜单的XML文件都应该放在这里。

在一个菜单XML布局中,有三个合法的元素:<menu>,<group>和<item>。item 和group 必须是菜单的子元素,而item 元素还可以是group的子元素,并且另外一个菜单元素可以是一个item 的子元素(来创建一个子菜单)。当然,任何文件的根元素必须是一个 menu 元素。

作为一个例子,我们将定义和在上面的选项菜单Options Menu章节中所创建的相同的菜单,我们首先在目录res/menu/里创建一个名为options_menu.xml 的文件。

Java代码

<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/new_game" android:title="New Game" />

<item android:id="@+id/quit" android:title="Quit" />

</menu>

然后,在onCreateOptionsMenu()方法里,我们通过MenuInflater.inflate()方法扩充这个资源:

Java代码

public boolean onCreateOptionsMenu(Menu menu)

{

MenuInflater inflater = getMenuInflater();

inflater.inflate(R.menu.options_menu, menu);

return true;

}

getMenuInflater() 方法返回我们活动上下文的MenuInflater。然后我们调用inflate(),传递给它一个指向我们菜单资源的指针以及回调给出的菜单对象。

尽管和在onCreateOptionsMenu()创建菜单比较起来,上面的例子看起来做了更多的事情,但是如果处理更多的菜单项,这将省掉很多麻烦并让你的代码简洁。

你可以通过把item元素打包进一个group中来定义菜单组menu groups,然后通过在一个item中嵌入另外一个menu来创建子菜单。每个元素都支持必需的属性来控制快捷键,复选框,图标,以及更多特性。

 
  1.  
  2.  
  3. package com.amaker.test;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.view.Menu;  
  7. import android.view.MenuItem;  
  8. import android.view.SubMenu;  
  9. /**  
  10.  *   
  11.  * 选项菜单实例  
  12.  */  
  13. public class MainActivity extends Activity {  
  14.       
  15.     private static final int ITEM1 = Menu.FIRST;  
  16.     private static final int ITEM2 = Menu.FIRST+1;  
  17.       
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.     }  
  22.  
  23.     /**  
  24.      * 覆盖该方法添加子菜单项  
  25.      */  
  26.     public boolean onCreateOptionsMenu(Menu menu) {  
  27.         SubMenu file = menu.addSubMenu("文件");  
  28.         SubMenu edit = menu.addSubMenu("編輯");  
  29.         file.add(0, ITEM1, 0, "新建");  
  30.         file.add(0, ITEM2, 0, "打开");  
  31.         return true;  
  32.     }  
  33.       
  34.     /**  
  35.      * 覆盖该方法,响应菜单选项被单击事件  
  36.      */  
  37.     public boolean onOptionsItemSelected(MenuItem item) {  
  38.         switch (item.getItemId()) {  
  39.         case ITEM1:  
  40.             setTitle("新建文件!");  
  41.             break;  
  42.         case ITEM2:  
  43.             setTitle("打开文件!");  
  44.             break;  
  45.         }  
  46.         return true;  
  47.     }  

 本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1080704



相关文章
|
11月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
345 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
7月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
126 19
|
XML Java Android开发
34. 【Android教程】菜单:Menu
34. 【Android教程】菜单:Menu
348 2
|
存储 开发工具 Android开发
构建高效的Android应用:从内存管理到用户界面
【5月更文挑战第29天】 随着智能手机的普及,Android应用的开发变得日益重要。然而,许多开发者在开发过程中忽视了性能优化,导致应用运行缓慢,用户体验差。本文将深入探讨如何通过有效的内存管理和用户界面优化,提升Android应用的性能。我们将详细介绍内存泄漏的原因和解决方案,以及如何使用Android的新特性来创建流畅的用户界面。无论你是新手还是经验丰富的开发者,都可以从本文中获得有用的技巧和建议。
|
编解码 数据库 Android开发
安卓应用开发:打造高效用户界面的五大技巧
【5月更文挑战第18天】在竞争激烈的应用市场中,一个流畅且直观的用户界面(UI)对于安卓应用的成功至关重要。本文将探讨五种提升安卓应用用户界面性能的技巧,包括合理布局设计、优化资源使用、利用硬件加速、内存管理以及响应式编程。通过这些方法,开发者可以创建出既美观又高效的应用体验,从而吸引和保留用户。
|
8月前
|
搜索推荐 前端开发 Android开发
安卓开发中的自定义视图——打造个性化用户界面
在安卓应用开发的广阔天地里,自定义视图是实现个性化界面设计的重要手段。通过深入理解安卓绘图基础、触摸事件处理和布局机制,开发者可以突破标准控件的限制,创造出独一无二的用户体验。本文将引导你探索自定义视图的核心概念,提供实用的代码示例,并分享如何有效地解决开发过程中可能遇到的挑战。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创新和个性化的大门。
|
开发工具 Android开发 开发者
Android Studio中两个让初学者崩溃菜单
Android Studio中两个让初学者崩溃菜单
77 0
|
8月前
|
搜索推荐 Android开发 UED
安卓开发中的自定义视图:打造个性化用户界面
【10月更文挑战第22天】在安卓应用的海洋中,如何让你的应用脱颖而出?一个独特且直观的用户界面(UI)至关重要。本文将引导你通过自定义视图来打造个性化的用户体验,从基础的视图绘制到触摸事件的处理,我们将一步步深入探讨。准备好了吗?让我们开始吧!
|
12月前
|
搜索推荐 Android开发 UED
探索安卓开发中的自定义视图:打造个性化用户界面
【7月更文挑战第31天】在安卓应用的海洋中,一个独特且吸引人的用户界面是捕获用户眼球的关键。本文将带你深入理解如何在Android开发中创建自定义视图,从而设计出与众不同的用户界面。我们将一起探索如何从零开始构建一个自定义视图组件,并实现动态交互效果。通过实际的代码示例和详细的步骤解析,你将学会如何提升你的应用界面,让它在众多应用中脱颖而出。
193 31
|
10月前
|
搜索推荐 Android开发 UED
安卓开发中的自定义视图:打造个性化用户界面
【9月更文挑战第11天】在安卓应用开发领域,自定义视图是实现独特用户体验的基石。本文将引导你通过一个简单的自定义视图示例,探索如何从零开始创建并应用自定义组件,以增强你的应用界面。我们将一起学习如何扩展View类,重写onDraw方法,处理触摸事件,并最终在我们的安卓项目中使用这个自定义视图。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供清晰的步骤和实用的技巧,帮助你提升用户界面设计的能力。

热门文章

最新文章