菜单在程序中使用颇为广泛,几乎所有的桌面应用都含有菜单。Android的菜单分为三种类型
- option menu:选项菜单
- context menu: 上下文菜单
- popup menu:弹出菜单
option menu
首先,好多人在使用选项菜单的过程中发现真机上并没有虚拟机上面的显示的三个点,无法使用菜单,这并不是菜单的问题。Android应用中的菜单默认是看不见的,只有当用户按下手机上的“MENU”键的时候,系统才会显示出菜单。所以在现在主流手机都取消了菜单键的情况下,建议使用ActionBar来代替相应菜单。
接下来我们来实现简单的菜单。首先我们先在要显示的布局文件中建立一个TextView,用来显示相关内容随后再为它绑定一个菜单。
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/text"
android:textSize="15pt"
android:id="@+id/txt">
</TextView>
</LinearLayout>
之后我们建立菜单。Android提供了两种建立菜单的方式,一种就是使用JAVA代码,而另一种是使用XML资源文件进行定义。在这里我们使用XML文件来定义菜单,因为这样可以提供更好的解耦,也不会使程序的代码过于臃肿,可扩展性和可维护性过低。
一般情况下Android Studio会自动在res目录下创建menu目录,而且在下面提供menu_main.xml菜单资源文件,如果有的话就直接可以编写,反正我的是menu文件夹都没有,这时候需要我们自己新建一个menu文件。
我们在res目录上右键新建,选择资源文件,再在资源类型中选择menu。
菜单资源的根目录通常是
<menu……/>
menu下面主要几种元素:
<item……/>元素
它定义了每一个菜单项
<group……/>元素
它可以把多个item合并成一个组
<menu……/>元素
可以创建子菜单,是在具体的item下面
这么看肯定不明白,举个例子,我们要创建如下样式的菜单:
菜单一共有三个选项,分别是字体大小,普通菜单选项,字体颜色,字体大小和字颜色下面分别有10号字16号字20号字和红色黑色。总结就是这个 menu大菜单下面有三个item,第二个就是一个简单的item下面什么都没有了,第一个和第三个下面都有一个group,group下有具体的item选项。
<?xml version="1.0" encoding="utf-8"?>
<!--根元素,无任何属性-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--定义菜单项-->
<item
android:title="@string/font_size"
>
<!--子菜单-->
<menu>
<!--定义一组单选菜单项-->
<group >
<!--定义多个菜单项-->
<item
android:id="@+id/font_10"
android:title="@string/font10"/>
<item
android:id="@+id/font_16"
android:title="@string/font16"/>
<item
android:id="@+id/font_20"
android:title="@string/font20"/>
</group>
</menu>
</item>
<!--定义一个普通菜单项-->
<item
android:id="@+id/plain_item"
android:title="@string/plain_item"/>
<item
android:title="@string/font_color"
>
<menu>
<!--定义一组普通菜单项-->
<group>
<!--定义两个菜单项-->
<item
android:id="@+id/red_font"
android:title="@string/red_title" />
<item
android:title="@string/black_title"
android:id="@+id/black_font"/>
</group>
</menu>
</item>
这样我们就写好了一个菜单,接下来我们需要在MainActivity中使用它,重写onCreateOptionsMenu方法,在这些方法中调用MenuInflater对象的inflate方法加载指定资源对应的菜单文件。
//在JAVA文件中对资源文件进行加载
public boolean onCreateOptionsMenu(Menu menu)//开发选项菜单重写的方法
{
MenuInflater inflater = new MenuInflater(this);//菜单动态加载类
inflater.inflate(R.menu.menu_main,menu);//调用inflate方法解析菜单文件
super.onCreateOptionsMenu(menu);
return true;
}
这时候菜单已经实现了大部分,要是希望程序能相应菜单项的单击事件,我们重写onOptionsItemSelected(MenuItem mi)方法就可以了。
public boolean onOptionsItemSelected(MenuItem mi){
switch (mi.getItemId()){
case R.id.font_10:
txt.setTextSize(20);
break;
case R.id.font_16:
txt.setTextSize(32);
break;
case R.id.font_20:
txt.setTextSize(40);
break;
case R.id.red_font:
txt.setTextColor(Color.RED);
break;
case R.id.black_font:
txt.setTextColor(Color.BLACK);
break;
case R.id.plain_item:
Toast toast =Toast.makeText(MainActivity.this,"这是普通单击项",Toast.LENGTH_SHORT);
toast.show();
break;
}
return true;
}
这里的txt是之前绑定的
private TextView txt;
txt = (TextView)findViewById(R.id.txt);