Android菜单(Menu)小结

2024-05-26 11:58
文章标签 android 小结 菜单 menu

本文主要是介绍Android菜单(Menu)小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),今天这讲是OptionsMenu 

概述

  public boolean onCreateOptionsMenu(Menu menu):使用此方法调用OptionsMenu 。

  public boolean onOptionsItemSelected(MenuItem item):选中菜单项后发生的动作。

  public void onOptionsMenuClosed(Menu menu):菜单关闭后发生的动作。

  public boolean onPrepareOptionsMenu(Menu menu):选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。

  public boolean onMenuOpened(int featureId, Menu menu):单打开后发生的动作。

1 Option Menu 
这种应该是最常见的,一般手机上都会提供Menu的按钮,对应的就是这个菜单弹出。 
主要步骤就是复写Activity父类中的onCreateOptionMenu(Menu menu)方法,然后通过Menu的add方法来添加菜单进去。 

@Override  
public boolean onCreateOptionsMenu(Menu menu) {  menu.add(0, MENU_ITEM_COUNTER, 0, "开始");  menu.add(0, MENU_ITEM_COUNTER + 1, 0, "暂停");  menu.add(0, MENU_ITEM_COUNTER + 2, 0, "结束");  return super.onCreateOptionsMenu(menu);  
}  

设置好Menu后需要对每一个MenuItem进行定义处理,当用户点击是会调用onOptionsItemSelected(MenuItem item)这个方法,需要对该方法进行重写 

@Override  
public boolean onOptionsItemSelected(MenuItem item) {  switch (item.getItemId()) {  case MENU_ITEM_COUNTER:  myTextView.setText("You click " + item.getTitle().toString()  + "Menu");  break;  case MENU_ITEM_COUNTER + 1:  myTextView.setText("You click " + item.getTitle().toString()  + "Menu");  break;  case MENU_ITEM_COUNTER + 2:  myTextView.setText("You click " + item.getTitle().toString()  + "Menu");  break;  default:  break;  }  return super.onOptionsItemSelected(item);  
}  
2.Context Menu  
翻译过来就是上下文菜单,其实知道Context最好是意会搞开发的都懂的,这个Mnue还是相当有用的,比如对于文件管理器来说一些增删改查就可以摆在ContextMenu中,它其实是实现了一个用户长按点击后弹出的来一个菜单。
首先,ContextMenu在新建是会调onCreateContextMune(Menu menu)方法,我们需要对它进行复写。

@Override  public void onCreateContextMenu(ContextMenu menu, View v,  ContextMenuInfo menuInfo) {  //设置面积大一点,好点唉  myTextView.setText("*******************************\n" + "要大一些看得才清楚的"  + "*******************************\n");  //itemId注意不要重复,否则处理起来很蛋疼  menu.add(0, MENU_ITEM_COUNTER + 3, 0, "白色");  menu.add(0, MENU_ITEM_COUNTER + 4, 0, "红色");  menu.add(0, MENU_ITEM_COUNTER + 5, 0, "蓝色");  super.onCreateContextMenu(menu, v, menuInfo);  }  
然后注册一下

/要记得在需要的控件上注册上下文菜单  registerForContextMenu(myTextView); 
当用户点击时会调用onContextItemSelected(MenuItem item)方法,对其重写
@Override  
public boolean onContextItemSelected(MenuItem item) {  //根据选择不同,对Text进行不同背景色的显示  switch (item.getItemId()) {  case MENU_ITEM_COUNTER + 3:  myTextView.setBackgroundColor(Color.WHITE);  break;  case MENU_ITEM_COUNTER + 4:  myTextView.setBackgroundColor(Color.RED);  break;  case MENU_ITEM_COUNTER + 5:  myTextView.setBackgroundColor(Color.BLUE);  break;  default:  break;  }  return super.onContextItemSelected(item);  
}  
3 Sub Menu  
个人觉得子菜单的概念应该是从属于以上两个菜单类型的,即两种菜单类型中都可以使用子菜单。 
实现很简单 
//申明一个子菜单  
SubMenu subMenu = menu.addSubMenu("这个是一个子菜单");  
subMenu.add(0, MENU_ITEM_COUNTER + 6, 0, "这个是子菜单的内容");  
选项菜单(OptionsMenu)的建立

一、 使用xml定义Menu

菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。

<menu>标签没有任何属性,但可以嵌套在<item>标签中,表示子菜单的形式。不过<item>标签中不能再嵌入<item>标签。

1.<item>标签的属性含义如下:

Id:表示菜单项的资源ID

menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。

orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值。例如menuCategory属性值都为system的3个菜单项(item1、item2和item3)。将这3个菜单项的orderInCategory属性值设为3、2、1,那么item3会显示在最前面,而item1会显示在最后面。

title:菜单项标题(菜单项显示的文本)

titleCondensed:菜单项的短标题。当菜单项标题太长时会显示该属性值

icon:菜单项图标资源ID

alphabeticShortcut:菜单项的字母快捷键

numericShortcut:菜单项的数字快捷键

checkable:表示菜单项是否带复选框。该属性可设计为true或false

checked:如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为true或false

visible:菜单项默认状态是否可视

enable:菜单项默认状态是否被激活

2.<group>标签的属性含义如下:

id:表示菜单组的ID

menuCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组

orderInCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组

checkableBehavior:设置该组所有菜单项上显示的选择组件(CheckBox或Radio Button)。如果将该属性值设为all,显示CheckBox组件;如果设为single,显示Radio Button组件;如果设为none,显示正常的菜单项(不显示任何选择组件)。要注意的是,Android SDK官方文档在解释该属性时有一个笔误,原文是:

Whether the items are checkable. Valid values: none, all(exclusive/radiobuttons), single(non-exclusive/checkboxes).

相反了,正确应该是

all(non-exclusive/checkboxes),single(exclusive/radiobuttons).

visible:表示当前组中所有菜单项是否显示。该属性可设置的值是true或false

enable:表示当前组中所有菜单项是否被激活。该属性可设置的值是true或false

3.具体使用

在代码中使用

public boolenonCreateOptionsMenu(Menu menu){

MenuInflatemenuInflate = getMenuInflate();

menuInflate.inflate(R.menu.option_menu,menu);

returntrue;

}

二、使用代码定义Menu

public boolean onCreateOptionsMenu(Menu menu){  

// 方法一,用代码构建   

 menu.add(Menu.NONE, Menu.NONE, 1, "菜单1");  

 menu.add(Menu.NONE, Menu.NONE, 2, "菜单2");  

 menu.add(Menu.NONE, Menu.NONE, 3, "菜单3");  

 menu.add(Menu.NONE, Menu.NONE, 4, "菜单4");  

menu.add(Menu.NONE, Menu.NONE, 5, "菜单5");  

menu.add(Menu.NONE, Menu.NONE, 6, "菜单6");  

return true;  

}  

三、菜单响应

重写onOptionsItemSelected(MenuItem item)这个方法就可以做响应的操作了。

四、实例

res/menu下的activity_main.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/action_settings1"android:orderInCategory="3"android:showAsAction="never"android:title="系统设置"/><itemandroid:id="@+id/action_settings2"android:orderInCategory="4"android:showAsAction="never"android:title="关于"/>
</menu>
MainActivity.java文件

package com.example.menudemo;import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class MainActivity extends Activity {/*** 表示xx通知ID*/public static final int NOTIFY_ID = 100;private Notification.Builder builder; private PendingIntent contentIntent = null; private NotificationManager nm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}private void notifyMessage(){// 发送通知需要用到NotificationManager对象 nm = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);// 消息对象Intent notificationIntent = new Intent(this, NotifyActivity.class);// PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)// 用来获得一个挂起的PendingIntent,让该Intent去启动新的Activity来处理通知contentIntent = PendingIntent.getActivity(MainActivity.this, 0, notificationIntent, 0); // 定制我们要在状态栏显示的通知样式builder = new Notification.Builder(MainActivity.this);builder.setContentIntent(contentIntent).setSmallIcon(R.drawable.ic_launcher)//设置状态栏里面的图标(小图标)                     .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.i5))//下拉下拉列表里面的图标(大图标)        .setTicker("this is bitch!") //设置状态栏的显示的信息.setWhen(System.currentTimeMillis())//设置时间发生时间.setAutoCancel(true)//设置可以清除.setContentTitle("This is ContentTitle")//设置下拉列表里的标题.setContentText("this is ContentText");//设置上下文内容// 获得刚才创建的通知对象Notification n = builder.getNotification();//获取一个Notificationn.defaults = Notification.DEFAULT_SOUND;//设置为默认的声音// 通过NotificationManger来发送通知消息// 参数1通知的ID,参数2发送哪个通知nm.notify(NOTIFY_ID, n);}public void sendNotifyBtn(View v){notifyMessage();}public void cancelNotifyBtn(View v){NotificationManager manger = (NotificationManager)this.getSystemService(NOTIFICATION_SERVICE);manger.cancel(NOTIFY_ID);}
}
NotifyActivity.java文件
package com.example.menudemo;import android.app.Activity;
import android.app.AlertDialog;
import android.app.NotificationManager;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;public class NotifyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);showDialog();}private void showDialog() {// 创建并显示一个对话框AlertDialog.Builder dlg = new AlertDialog.Builder(this);// 自定义Dialog需要自己创建或转换一个View,将其通过下面的方法显示。//dlg.setView(view);// 设置对话框显示样式dlg.setTitle("我是对话框标题");dlg.setMessage("我是对话框内容");dlg.setIcon(R.drawable.ic_launcher);dlg.setPositiveButton("是", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("PositiveButton被点击");NotificationManager manger = (NotificationManager)NotifyActivity.this.getSystemService(NOTIFICATION_SERVICE);manger.cancel(MainActivity.NOTIFY_ID);}});dlg.setNegativeButton("否", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("NegativeButton被点击");}});dlg.setNeutralButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {System.out.println("NeutralButton被点击");}});// 不允许用户取消对话框dlg.setCancelable(false);dlg.create();// 对话框显示必须要调用 show();dlg.show();}}

参考博客:

http://blog.csdn.net/yuzhongchun/article/details/8956256

http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html
参考代码:

http://download.csdn.net/detail/u010963246/8898159

这篇关于Android菜单(Menu)小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004404

相关文章

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

gorm乐观锁使用小结

《gorm乐观锁使用小结》本文主要介绍了gorm乐观锁使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言grom乐观锁机制gorm乐观锁依赖安装gorm乐观锁使用创建一个user表插入数据版本号更新总结前言乐观锁,顾名

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.