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

ContractedBlock.gifExpandedBlockStart.gif代码
package com.amaker.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
/**
*
* 选项菜单实例
*/
public class MainActivity extends Activity {

private static final int ITEM1 = Menu.FIRST;
private static final int ITEM2 = Menu.FIRST+1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

/**
* 覆盖该方法添加菜单项
*/
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(
0, ITEM1, 0, "开始");
menu.add(
0, ITEM2, 0, "退出");
return true;
}

/**
* 覆盖该方法,响应菜单选项被单击事件
*/
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM1:
setTitle(
"开始游戏!");
break;
case ITEM2:
setTitle(
"退出!");
break;
}
return true;
}
}

 

 

 

 

上下文菜单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;  

 default:    return 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都被注册到这个上下文菜单。

 

ContractedBlock.gifExpandedBlockStart.gif代码
package com.amaker.test;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.TextView;

/**
*
*
@author 测试上下文菜单,改变背景色
*/
public class MainActivity extends Activity {
private static final int ITME1 = Menu.FIRST;
private static final int ITME2 = Menu.FIRST+1;
private static final int ITME3 = Menu.FIRST+2;
private TextView myTV;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTV
= (TextView)findViewById(R.id.TextView01);
registerForContextMenu(myTV);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.add(
0, ITME1, 0, "红色背景");
menu.add(
0, ITME2, 0, "绿色背景");
menu.add(
0, ITME3, 0, "白色背景");
}

@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITME1:
myTV.setBackgroundColor(Color.RED);
break;
case ITME2:
myTV.setBackgroundColor(Color.GREEN);
break;
case ITME3:
myTV.setBackgroundColor(Color.WHITE);
break;
}
return true;
}
}

 

 


 

子菜单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来创建子菜单。每个元素都支持必需的属性来控制快捷键,复选框,图标,以及更多特性。

ContractedBlock.gifExpandedBlockStart.gif代码
package com.amaker.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
/**
*
* 选项菜单实例
*/
public class MainActivity extends Activity {

private static final int ITEM1 = Menu.FIRST;
private static final int ITEM2 = Menu.FIRST+1;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}

/**
* 覆盖该方法添加子菜单项
*/
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu file
= menu.addSubMenu("文件");
SubMenu edit
= menu.addSubMenu("編輯");
file.add(
0, ITEM1, 0, "新建");
file.add(
0, ITEM2, 0, "打开");
return true;
}

/**
* 覆盖该方法,响应菜单选项被单击事件
*/
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM1:
setTitle(
"新建文件!");
break;
case ITEM2:
setTitle(
"打开文件!");
break;
}
return true;
}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT打开文件

https://www.cnblogs.com/ZY-Dream/p/10571490.html

12.5

持续关注一下足球经理游戏 转载于:https://www.cnblogs.com/dandansang/p/7980132.html

流浪宠物救助网站前端页面_全国爱心人士齐聚鞍山 救助流浪猫狗

入冬之后&#xff0c;流浪猫狗的“吃饭问题”成了众多爱心人士的牵挂。12日上午&#xff0c;来自全国各地的20余位爱心人士&#xff0c;来到宁远镇张忠堡村一流浪猫狗救助站&#xff0c;将价值7000余元的宠物用品捐赠给救助站。当日早上8时许&#xff0c;爱心人士们特意到铁西八…

问题解决

问题解决了&#xff0c;把 #include <string.h> 改写成 #include <string> 就行了 #include <iostream> #include <string> #include "tinystr.h" #include "tinyxml.h" #include <vector> #include "Text.h" #in…

QT 线程之间通信

1.先说QT线程。都知道QT线程有两种使用方式&#xff0c;一种是继承QThread重写run()&#xff0c;一种是继承QObject然后再MovetoThread()到线程下。我也是刚学QT&#xff0c;之前一直做MFC。现在有个问题&#xff0c;我想要创建的是单次运行的线程&#xff0c;就是处理完后就自…

微信小程序 开发过程中遇到的坑(一)

21241.我们使用app.json文件来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 的时候在pages中写注释的时候回报错。 例如&#xff1a; {"pages":[//这是首页面"pages/welcome/welcome"] } 此时就会报错…

java 创建日程到期提醒_日程管理工具—Things 3

Mac上最好用的日程管理工具是哪个&#xff1f;Things 3 for Mac是首选&#xff0c;Things3 Mac全新的设计&#xff0c;外观简洁、大气&#xff0c;功能也是非常强大的&#xff0c;让你用一种优雅而直观的方式来管理个人事务&#xff0c;无论在生活还是工作中&#xff0c;都能取…

数据库优化小结

WHERE条件的优化&#xff1a;1、IN&#xff1a;至少多一个转换的过程&#xff08;先试图转成多个表的连接&#xff0c;如果转换不成功先执行IN里面的子查询&#xff0c;再查询外层记录&#xff09;2、NOTIN&#xff1a;不能应用表索引&#xff0c;可用NOT EXISTS替换的3、<&…

使用VS制作MFC、libmysql.dll出现计算机缺少msvcr120.dll和msvcp120.dll问题

自己应客户要求做了一个数据库的查询工具&#xff0c;结果在客户电脑那边运行出现了计算机缺少msvcr120.dll和msvcp120.dll问题&#xff0c;一开始以为是MFC程序自身有动态链接&#xff0c;结果才发现是libmysql.dll本身依赖于msvcr120.dll和msvcp120.dll&#xff0c;这两个库对…

python 流程控制if判断

简单看下if判断在python的基本用法 # gyf28 定义变量gyf # if gyf > 20: 判断 gyf 是不是〉20# print(你真年轻) 简单实现了 if判断的用法 下面我们再来做一个例子 if判断 gyf是不是〉18 并且〈 22 如果是 则执行打印的任务 输出 表白 如果条件不成立输入打印 阿姨…

python同步oracle_Python cx_Oracle 7引入苏打文档存储

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件cx _甲骨文7 .0是非常受欢迎的蟒蛇甲骨文数据库接口,现在是PyPI上的产品。cx _甲骨文是一个开源包,它涵盖了大蟒数据库应用编程接口规范,并添加了许多支持神谕高级功能的内容。安东尼 图宁加刚刚发布了cx _…

总结2010展望2011

总结2010 展望2011转载于:https://www.cnblogs.com/zhouxiuquan/archive/2011/01/28/1947269.html

XP下使用FFMPEG(API和exe)遇到的问题和解决方法。

XP下使用FFMPEG&#xff08;API和exe&#xff09;遇到的问题和解决方法。1、需求背景2、遇到的问题3、解决方法下载链接1、需求背景 因为最近接到项目上的一个需求&#xff0c;就是在MP4&#xff08;H264编码&#xff09;文件里叠加指定字符&#xff0c;于是就想到了使用FFMPE…

钢材规格解读的软件_万维软件ERP五金建材行业解决方案

一、五金建材行业的特征&#xff1a;1、企业的规对较小&#xff1a;身为老板却“身兼多职”&#xff0c;采购、销售、发货、出纳啥都做&#xff1b;2、业务非常多样&#xff1a;虽然这类企业规模小&#xff0c;但也涉及到批发、零售、工程(局部工程)、家装等经营型态&#xff0…

MSDE 认证方式

1. 停止 MSSQLSERVER 以及所有其他相关服务&#xff08;如 SQLSERVERAgent 2. 打开注册表编辑器。要打开注册表编辑器&#xff0c;请依次单击开始和运行&#xff0c;然后键入&#xff1a;“regedt32”3. 找到以下两个子项之一&#xff08;取决于 MSDE 是作为默认 MSDE 实例安装…

duilib学习

记录duilib自学过程。 最近年底公司也没啥事情&#xff0c;自己就想着上网看看duilib怎么制作界面&#xff0c;因为之前想学习一直没时间&#xff0c;现在来看看。 其实学习的就好办法就是看demo&#xff0c;关于duilib网上的学习教程并不多&#xff0c;自己跟着demo敲一遍代…

2017.12.1T19_B2_2zuoye

package com.whxiong.work01; import java.util.Scanner; public class Calculator { Scanner input new Scanner(System.in); public void show() { char Calculator; double num 0; double num1 0; System.out.println("请输入第一个整数&#xff1a;"); …

git指令快捷 idea_IDEA+Git+Gitlab使用详细教程

GitLab 安装踩坑502错误码和访问卡顿解决办法Gitlab对内存的要求高&#xff0c;我的服务器Centos 72核心2G内存&#xff0c;频繁报502错误&#xff0c;访问也很卡。原因可能是可用内存太少。# free -m 查看可用内存这里看到free不多了&#xff0c;解决办法有扩内存或者使用虚拟…

记:ubuntu下交叉编译arm的链接库

以第三方库libjpeg为例&#xff0c;编译所需要的三步&#xff1a; 1、配置./configure脚本参数&#xff0c; ./configure --prefix/home/huanghaitao/Winshare/jpeg-9c/libjpeg CCarm-linux-gnueabihf-gcc --hostarm-linux --enable-shared --enable-static–prefix&#xff0…

flash 绘图API:绘制弧线

把之前没有记录的笔记都记录一下&#xff0c;顺便方便日后查询。绘制弧线&#xff0c;对于一些制作课件的人来讲会有一些用处的。绘制弧线采用的基本思路是采用描点的方法实现。从一个开始角度&#xff0c;到另一个角度结束&#xff0c;在这个角度区间里面进行描点连线。 【A&a…