android 4中菜单的使用

1. 为什么会有菜单

菜单一般是提供一些设置或是软件信息什么的,移动设备的屏幕不像PC那么大,不可能在屏幕搞一些按键来触发一些平时使用不会经常操作的事件,比如设置软件配置,查看软件信息什么的。这些功能可以添加到菜单选项中,既提供了该功能,又不会占用屏幕空间。(纯属扯淡有木有啊!!!因为我实在想不出要以什么开头写这篇总结)

2. 菜单的不同创建方法

2.1 动态创建

通过重写Activity中的onCreateOptionMenu方法来创建菜单,一般使用menu.add(“选项名”)为添加一个菜单选项,menu.getItem(int itemIndex)则是根据选项的索引获取该菜单选项,并对其进行操作,比如添加点击事件onMenuItemClickListener,用addSubMenu添加子菜单等。

优点:创建方便,不需要建立资源文件。

缺点:对于菜单条目过多或多级菜单操作不方便,按键多添加点击事件不方便。

2.2 通过XML资源文件创建

可以通过menu文件夹下的menu.xml创建菜单的样式,然后再利用getMenuInflater().inflate(menuRes, menu)将创建的菜单样式inflate到程序中。大体主要分三步:

第一步:建立XML资源文件:menu.xml文件一般的定义方式见如下:

view sourceprint?

01.<?xmlversionxmlversion="1.0"encoding="utf-8"?>

02.<menuxmlns:androidmenuxmlns:android="http://schemas.android.com/apk/res/android">

03.<itemandroid:iditemandroid:id="@+id/file"

04.android:title="@string/file">

05.<!-- "file" submenu 添加子菜单 -->

06.<menu>

07.<!-- 子菜单的选项 -->

08.<itemandroid:iditemandroid:id="@+id/create_new"

09.android:title="@string/create_new"/>

10.<itemandroid:iditemandroid:id="@+id/open"

11.android:title="@string/open"/>

12.</menu>

13.</item>

14.</menu>

第二步:在onCreateOptionMenu回调函数完成XML资源的infate,把菜单资源文件压入到程序中,不同菜单使用不同的回调函数,比如ContextMenu使用onCreateContextMenu:

view sourceprint?

1.publicbooleanonCreateOptionsMenu(Menu menu) {

2.// Inflate the menu; this adds items to the action bar if it is present.

3.getMenuInflater().inflate(R.menu.main, menu);

4.returntrue;

5.}

第三步:如果我们需要给菜单添加点击事件,一般我们是通过重写onMenuItemSelected来设置的,不同菜单使用不同的点击回调函数,比如ContextMenu使用onContextItemSelected写法如下:

view sourceprint?

01.publicbooleanonMenuItemSelected(intfeatureId, MenuItem item) {

02.switch(item.getItemId()) {

03.caseItem.ID1:

04.//do something

05.break;

06.caseItem.ID2:

07.//do something

08.break;

09.//......

10.}

11.returnsuper.onMenuItemSelected(featureId, item);

12.}

3. 菜单的类型:

   3.1 普通菜单:

一般的普通菜单,点击菜单键后显示出来的菜单,使用方法如第二点所述,只是设置item标签时把showAsAction值设为never即可。

   3.2 显示在ActionBar的菜单:

这样的菜单可以直接从屏幕中看到,不需要点击菜单键才会显示,要做到这个只需要把Item的showAsAction从never改成ifRoom(如果有空间则显示)或always(总是显示)。例子如下;

view sourceprint?

01.<menuxmlns:androidmenuxmlns:android="http://schemas.android.com/apk/res/android">

02.<item

03.android:id="@+id/info"

04.android:orderInCategory="100"

05.android:showAsAction="never"

06.android:title="软件信息">

07.<menu>

08.<itemandroid:iditemandroid:id="@+id/authorInfo"

09.android:title="软件开发者信息"/>

10.<itemandroid:iditemandroid:id="@+id/versionInfo"

11.android:title="软件版本信息"/>

12.</menu>

13.</item>

14.<!-- 建立一个在Action的菜单选项 -->

15.<item

16.android:id="@+id/settings"

17.android:orderInCategory="100"

18.android:showAsAction="always"

19.android:icon="@drawable/ic_launcher">

20.<menu>

21.<itemandroid:iditemandroid:id="@+id/sysSetting"

22.android:title="系统设置"/>

23.<itemandroid:iditemandroid:id="@+id/softSetting"

24.android:title="软件设置"/>

25.</menu>

26.</item>

27.</menu>

效果图:

   3.3 浮动菜单(属于ContextMenu):

一般添加到ListView或GridView的菜单,长按菜单的某一项可以出发浮动菜单,定义这种菜单主要步骤如下:

1、建立一个View,常用的为ListView或GridView;

2、建立XML菜单资源文件;

3、在Activity中的onCreateContextMenu函数中使用getMenuInflater().inflate()方法将XML菜单资源文件压入;

4、在onContextItemSelected回调函数中添加菜单选项的点击事件。

5、使用registerForContextMenu(View)为该View注册ContextMenu;

源码示例如下:

view sourceprint?

01.privateListView list;

02.@Override

03.protectedvoidonCreate(Bundle savedInstanceState) {

04.super.onCreate(savedInstanceState);

05.setContentView(R.layout.activity_main);

06.String[] listItem = { "1""2""3""4""5"};

07.ArrayAdapter<String> aa = newArrayAdapter<String>(this,

08.android.R.layout.simple_list_item_1, listItem);

09.list = (ListView) findViewById(R.id.list);

10.list.setAdapter(aa);

11.registerForContextMenu(list);  

12.//为list注册上下文菜单,通过onCreateContextMenu把XML菜单资源文件压进来,

13.//通过onContextItemSelectd为每个菜单选项添加长按点击事件。

14.}

15.@Override

16.publicvoidonCreateContextMenu(ContextMenu menu, View v,

17.ContextMenuInfo menuInfo) {

18.super.onCreateContextMenu(menu, v, menuInfo);

19.getMenuInflater().inflate(R.menu.float_menu, menu);

20.}

21.@Override

22.publicbooleanonContextItemSelected(MenuItem item) {

23.switch(item.getItemId()) { //判断长按点击了那个选项,为每个选项添加长按点击事件

24.caseR.id.exit:

25.showToast("exit");

26.break;

27.caseR.id.next:

28.showToast("next");

29.break;

30.caseR.id.back:

31.showToast("back");

32.break;

33.}

34.returnsuper.onContextItemSelected(item);

35.}

36.privatevoidshowToast(String str) {

37.Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();

38.}

效果图:

   3.4 ActionMode菜单(也属于ContextMenu):

显示在ActionBar的菜单,这种菜单是用于定义比较重要或常用的功能,放在ActionBar比较显眼。触发这种菜单跟浮动菜单一样,要长按,浮动菜单直接采用注册方法,而该菜单则需要我们去设置View的长按事件(setOnLongClickListener)。

使用方法:

1、建立XML菜单资源文件;

2、建立一个内部类实现ActionMode.Callback接口,实现该接口的四个函数(onCreateActionMode,onPrepareActionMode,onActionItemClicked,onDestroyActionMode)

3、在onCreateActionMode把XML文件压进来,而且返回true!

4、在onActionItemClicked中添加菜单选项点击事件;

5、建立一个View,以Button为例,添加OnLongClickListener事件,事件内容为startActionMode(实现Callback接口的类);

源代码示例:

(1)XML资源文件:

view sourceprint?

01.<LinearLayoutxmlns:androidLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

02.xmlns:tools="http://schemas.android.com/tools"

03.android:layout_width="match_parent"

04.android:layout_height="match_parent"

05.android:paddingBottom="@dimen/activity_vertical_margin"

06.android:paddingLeft="@dimen/activity_horizontal_margin"

07.android:paddingRight="@dimen/activity_horizontal_margin"

08.android:paddingTop="@dimen/activity_vertical_margin"

09.android:orientation="vertical"

10.tools:context=".MenuActivity2">

11.<Button

12.android:id="@+id/btn_actionMode"

13.android:layout_width="match_parent"

14.android:layout_height="wrap_content"

15.android:text="打开ActionMode菜单"/>

16.<Button

17.android:id="@+id/btn_popUp"

18.android:layout_width="match_parent"

19.android:layout_height="wrap_content"

20.android:text="打开PopUp菜单"/>

21.</LinearLayout>

(2)实现Callback的Java代码:

view sourceprint?

01.privateclasscallback implementsActionMode.Callback {

02.@Override

03.publicbooleanonActionItemClicked(ActionMode mode, MenuItem item) {

04.switch(item.getItemId()) {

05.caseR.id.user_info:

06.Toast.makeText(MenuActivity2.this"You click user_info",

07.Toast.LENGTH_SHORT).show();

08.returntrue;

09.caseR.id.user_setting:

10.Toast.makeText(MenuActivity2.this"You click user_setting",

11.Toast.LENGTH_SHORT).show();

12.returntrue;

13.caseR.id.user_login:

14.Toast.makeText(MenuActivity2.this"You click user_login",

15.Toast.LENGTH_SHORT).show();

16.returntrue;

17.default:

18.returnfalse;

19.}

20.}

21.@Override

22.publicbooleanonCreateActionMode(ActionMode mode, Menu menu) {

23.getMenuInflater().inflate(R.menu.menu_activity2, menu);

24.returntrue;

25.}

26.@Override

27.publicvoidonDestroyActionMode(ActionMode mode) {

28.Log.i("cth""ActionMode is destroyed.");

29.actionMode = null;

30.}

31.@Override

32.publicbooleanonPrepareActionMode(ActionMode mode, Menu menu) {

33.returnfalse;

34.}

35.}

(3)长按事件Java代码:

view sourceprint?

01.btn_actionMode = (Button) findViewById(R.id.btn_actionMode);

02.btn_actionMode.setOnLongClickListener(newOnLongClickListener() { //添加长按事件

03.@Override

04.publicbooleanonLongClick(View v) {

05.if(actionMode != null) {

06.returnfalse;

07.}

08.actionMode = startActionMode(newcallback());  //开启ActionMode菜单

09.v.setSelected(true);        //设置为可选

10.returntrue;

11.}

12.});

效果图(红框即为ActionMode菜单):

   3.5 Popup弹出菜单:

该类菜单需要和某个View绑定,当点击该View时在该View的上面或下面(视屏幕空间而定)弹出菜单。

使用方法:

1、建立XML菜单资源文件;

2~5步均可在绑定View的点击事件中实现!

2、建立PopupMenu对象,实例化传入上下文context和绑定的View;

3、使用PopupMenu对象的getMenuInflater().inflate()把XML菜单文件压进来,

4、使用PopupMenu对象自身的setOnMenuItemClickListener设置点击事件;

5、使用PopupMenu对象自身的show显示弹出菜单。

源代码示例:

(1)在View的点击事件中设置2~5步内容:

view sourceprint?

01.btn_popUp = (Button) findViewById(R.id.btn_popUp);

02.btn_popUp.setOnClickListener(newOnClickListener() {

03.@TargetApi(Build.VERSION_CODES.HONEYCOMB)

04.@SuppressLint("NewApi")

05.@Override

06.publicvoidonClick(View v) {

07.PopupMenu popup = newPopupMenu(MenuActivity2.this, v);  //建立PopupMenu对象

08.popup.getMenuInflater().inflate(R.menu.menu_activity2,   //压入XML资源文件

09.popup.getMenu());

10.popup.setOnMenuItemClickListener(MenuActivity2.this);    //设置点击菜单选项事件

11.popup.show();                                            //显示菜单

12.}

13.});

(2)点击事件

view sourceprint?

01.@Override

02.publicbooleanonMenuItemClick(MenuItem item) {

03.switch(item.getItemId()) {

04.caseR.id.user_info:

05.Toast.makeText(MenuActivity2.this"You click user_info",

06.Toast.LENGTH_SHORT).show();

07.returntrue;

08.caseR.id.user_setting:

09.Toast.makeText(MenuActivity2.this"You click user_setting",

10.Toast.LENGTH_SHORT).show();

11.returntrue;

12.caseR.id.user_login:

13.Toast.makeText(MenuActivity2.this"You click user_login",

14.Toast.LENGTH_SHORT).show();

15.returntrue;

16.default:

17.returnfalse;

18.}

19.}

效果图:

4. 总结:

菜单主要分两种,OptionMenu和ContextMenu,只有浮动菜单(floating menu)和ActionMode菜单为ContextMenu。OptionMenu建立菜单的方法为在onCreateOptionMenu中inflate XML文件,在onMenuItemClick中设置点击事件(PopupMenu使用自身的setOnMenuItemClickListener设置),ContextMenu建立菜单的方法为在onCreateContextMenu中inflate XML文件(ActionMode在Callback中),在onContextItemClick中设置点击事件。

时间: 2024-08-01 21:39:35

android 4中菜单的使用的相关文章

Android:WebView中对图片注册上下文菜单

前言 今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能.今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧. 概要实现 其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来 注册上下文菜单事件 这个就比较简单了通过下面的代码即可完成. WebView vw = (WebView) findV

android Music 中如何添加设置双卡铃声的菜单

1,打开情景模式的设置双卡铃声的feature:MTK_MULTISIM_ROINGTONE_SUPPORT,Music中却不能设置双卡铃声. 希望能在Music添加菜单"Us as SIM1/SIM2 ringtone" 1,string.xml,添加新的string ringtone_as_sim1_menu和ringtone_as_sim2_menu : <string name="ringtone_as_sim1_menu">Use as SIM

Android系统中添加一个产品----图文详解

本文本着开源的精神介绍如何向一个Android系统中添加一个产品的整个过程,按照以下过程笔者有理由相信每个将要从事本行业的人都可以完成,其实添加一个产品并不难,难的是对其相关硬件的修改,好了废话不多说. 首先我们要创建一个属于自己产品的目录,这里以WY_device为例,以WY作为产品的名字. 首先从已经存在的产品中拷贝一个以产品的名字为名的.mk文件,修改为自己的.mk文件,在这里为WY.mk 对其进行如下的修改: 然后添加AndroidProducts.mk  这是添加产品的配置文件名路径,

在Android Studio中创建项目和模拟器

北京电子科技学院 实      验      报      告 课程:移动平台应用开发实践  班级:201592  姓名:杨凤  学号:20159213 成绩:___________  指导老师:娄嘉鹏   实验日期 :2015.11.1 实验名称:           在Android Studio中创建项目和模拟器 实验内容:       1.在Android Studio中创建项目 2.创建并启动Android模拟器 一.实验简介 熟悉Android的开发环境.一些基本的操作技巧以及调试技

Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个朋友在评论中留言,希望我可以帮他将这个滑动菜单改成双向滑动的方式.当时也没想花太多时间,简单修改了一下就发给了他,结果没想到后来却有一大批的朋友都来问我要这份双向滑动菜单的代码.由于这份代码写得很不用心,我发了部分朋友之后实在不忍心继续发下去了,于是决定专门写一篇文章来介绍更好的Android双向滑

android圆形旋转菜单,并支持移动换位功能

LZ最近接手公司一个项目,需要写一个圆形的旋转菜单,并且支持菜单之间的移动换位,本来以为这种demo应该网上是很多的,想不到度娘也是帮不了我,空有旋转功能但是却不能换位置,所以LZ就只能靠自己摸索了. 最终LZ参考了网上的部分代码,重写了一个自定义的view终于实现了这个看似很吊,却没有实际意义的功能.在此贡献出来给广大码农们共享. 话不多说,先上代码: 自定义view类: public class RoundSpinView extends View { private Paint mPain

Android学习之菜单

android中包含多种菜单,本例带来的是选项菜单和上下文菜单. 1.选项菜单 在android中,开发者可以在xml文档中部署所要添加的菜单,在后台调用即可. 1 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 2 3 <item 4 android:id="@+id/action_add" 5 android:title="添加" 6 an

studio--如何将Eclipse中的项目迁移到Android Studio 中

如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的是生成Build Gradle的文件.因为Android Studio 是用Gradle来管理项目的,具体操作步骤如下: 从Eclipse中导出        1.将你的ADT插件版本升级到22.0以上.        2.在Eclipse中,选择File-->Export.        3.在弹出的导出窗口中,打开Android的文件夹,选择“Generate

[Android]AndroidDesign中ActionBar探究1

概述 从Google IO 2013大会以来越来越多的Android应用开始遵循Android的设计风格,简单的就是google play和Gmail,在国内我们常用的软件像知乎.印象笔记,主要的界面主要是左侧的抽屉菜单(参照).顶部和底部的ActionBar(参照)等.由于以前都是遵循Ios的设计开始开发的一些,现在在公司,公司开始推崇Android Desgin(我们公司总是走在前列啊,现在Team 开发的 Version Control开始在Git开发),我们也必须要看下ActionBar