Android(java)学习笔记196:Android中Menu的使用(静态和动态)

时间:2023-03-09 09:50:36
Android(java)学习笔记196:Android中Menu的使用(静态和动态)

1. 使用xml定义Menu(静态方法)

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

(1)<item>标签的属性

Id:表示菜单项的资源ID

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

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

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

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

icon:菜单项图标资源ID

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

icon:菜单项图标资源ID

alphabeticShortcut:菜单项的字母快捷键

numericShortcut:菜单项的数字快捷键

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

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

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

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

showAsAction:应用程序目标设为蜂巢平台时,你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。这个属性可接受的值有: 

    ifRoom 会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。当然个
数并不仅仅局限于4个,依据屏幕的宽窄而定
    never 永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好
把标题都带上。
    always 无论是否溢出,总会显示。
    withText withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个
标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可
能显示不全。
   collapseActionView   声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,
这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
一般要配合ifRoom一起使用才会有效果。

(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

案例如下:

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.himi.menudemo1.MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </RelativeLayout>

MainActivity.java:

package com.himi.menudemo1;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
if (id == R.id.option) {
Toast.makeText(this, "你点击的是option选项卡", 1).show();
}
if (id == R.id.exit) {
Toast.makeText(this, "你点击的是exit选项卡", 1).show();
}
return super.onOptionsItemSelected(item);
}
}

res/menu/main.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.himi.menudemo1.MainActivity" >
<!-- android:orderInCategory:item的属性,用来排序的(优先级,值越大优先级越小) -->
<item
android:id="@+id/action_settings"
android:orderInCategory="300"
android:showAsAction="never"
android:title="@string/action_settings"/>
<item
android:id="@+id/option"
android:orderInCategory="200"
android:showAsAction="never"
android:title="@string/option"/>
<item
android:id="@+id/exit"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/exit"/> </menu>

程序运行结果:

Android(java)学习笔记196:Android中Menu的使用(静态和动态)

点击exit:

Android(java)学习笔记196:Android中Menu的使用(静态和动态)

同理点击option:

Android(java)学习笔记196:Android中Menu的使用(静态和动态)

2. 动态方法

我们直接看代码:

menu.add(groupId, itemId, order, title)

groupld:代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。

itemid:代表的是项目编号。这个参数非常重要,一个item ID对应一个menu中的选项。在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项。

order:代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。

title:表示选项中显示的文字。

MainActivity.java:

package com.himi.menudemo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0,0,0,"关于");
menu.add(0,1,1,"退出");
return true ;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
int id = item.getItemId();
switch (id) {
case 0:
// new AlertDialog.Builder(this).setTitle("简介")
// .setIcon(android.R.drawable.ic_dialog_info)
// .setMessage("从前从前有个人爱你很久,\n但偏偏风渐渐把距离吹得好远,\n"
// + "好不容易又能再多爱一天,\n但故事的最后你好像还是说了拜拜.")
// .setPositiveButton("确认", null).show();
// new AlertDialog.Builder(this).setTitle("简介")
.setIcon(android.R.drawable.ic_dialog_info)
.setSingleChoiceItems(new String[] {"option0","option1","option2","option3","option4"}, 0, new OnClickListener() { public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "你选择的是选项"+which, 0).show(); }
}).setPositiveButton("确认", null).show();
break; case 1:
finish();
break; default:
break;
} return true;
}
}

acitivity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.himi.menudemo.MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </RelativeLayout>

程序运行之后点击右上角的菜单,出现的效果如下:

Android(java)学习笔记196:Android中Menu的使用(静态和动态)

点击"关于",出现如下效果:

Android(java)学习笔记196:Android中Menu的使用(静态和动态)