Android 提供了三种菜单类型:
Options Menu 选项菜单(主菜单)通常是按 Home键来显示。
Context Menu 上下文菜单 (右键菜单)在View 长按后显示。
Sub Menu 子菜单 子菜单就是点击一个菜单后弹出的下级菜单。
Options Menu 和 Context Menu 都可以加入 子菜单(sub Menu)子菜单不能在嵌套子菜单。也就是说 Android 支持3级菜单,超过3级后对于用户来说或许就操作太复杂,不利于用户体验!
Android 还提供了对菜单进行分组的功能,可以把类似的菜单功能分成一个组,这样可以通过调用setGroupCheckable,setGropEnabled,setGroupVisible来设置菜单属性,而无需单独进行设置。
菜单是可以随机生成和修改或者删除,菜单可以由xml文件创建菜单。
菜单中可以添加图标,但是不是所有的菜单都可以添加图标!
让我们认识下这些菜单吧:
主菜单(Options Menu):
下面的菜单就是主菜单(Options Menu)呼出方式 是 按下MENU键即可呼出此菜单。
主菜单,只能显示6个菜单项,如果超出项将出现更多~(我们在设计中也做好不要超过7个菜单项,因为这样用户操作的话就会多操作1步)。
上下文菜单(Context Menu):
下面的菜单就是 上下文菜单(Context Menu),此菜单通过长按屏幕 2s以上将其呼出。
子菜单(Sub Menu):
子菜单是通过 按下一个有下级菜单的选项后而弹出的菜单,通常称为子菜单,如 屏幕的主菜单为 [ 苹果 | 桃子] 此时桃子带有子菜单 当我们点击桃子时 下面的菜单就会被呼出,此菜单就是 桃子的子菜单(Sub Menu)。
创建 菜单(Menu) 资源:
通常我们创建 Android Menu 使用的是 xml 文件来创建,
Menu/first_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/new_file"
<!-- id 就是他的名字,当进行菜单相应的时候就会用到id 也就是标识菜单项 -->
android:icon="@drawable/ic_new_file"
<!-- icon 就是 菜单中用到的图标,当我们添加了菜单图片就会在菜单上出现图标-->
android:title="@string/new_file"
<!-- title 是标题,菜单项显示的文本内容 -->
/>
<item
android:id="@+id/exit_file"
android:icon="@drawable/ic_new_file"
android:title="@string/exit_file"
/>
</menu>
然后需要在string.xml中需要添加一个字符串资源
string.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MenuTest2Activity!</string>
<string name="app_name">MenuTest2</string>
<string name="new_file">新建</string>
<string name="exit_file">退出</string>
</resources>
菜单需要在 Activity 中实现调用 我们创建菜单需要 一个方法来实现一个方法 创建菜单的方法是: public booleann onCreateOptionsMenu(Menu menu){
return true;
}
此方法的作用是初始化 菜单的内容,我们必须将选项添加到menu中去,而且此方法只能被调用一次,当我们的菜单一次显示的时候调用
menu 创建的菜单就是这里的 menu
return 如果你显示的话就必须让 return 返回值 为 true;
我们覆盖这种方法为:
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.first_menu,menu);
return true;
}
全部的代码是:MenuTest3
package cn.android.menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class MenuTest3 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.first_menu, menu);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()){
case R.id.new_file:
Toast.makeText(this, "显示新建", Toast.LENGTH_SHORT).show();
break;
case R.id.exit_file:
Toast.makeText(this, "退出啦",Toast.LENGTH_SHORT).show();
break;
}
return super.onMenuItemSelected(featureId, item);
}
}
这样我们的 菜单就生效了!
这里 我们点击 新建 或者 退出 屏幕就会给我们返回相应的信息,新建->显示新建 ,退出->退出啦!
相应的菜单项 也会消失!
另一种动作(事件)
使用
onMenuClick(Menu item){
.....
}
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()){
case R.id.new_file:
Toast.makeText(this, "显示新建", Toast.LENGTH_SHORT).show();
break;
case R.id.exit_file:
Toast.makeText(this, "退出啦",Toast.LENGTH_SHORT).show();
this.finish();
break;
}
return false;
}
this.finish(); 是退出的意思,在这里我们点退出 菜单 程序就会退出!
动态的添加 修改和删除菜单:
动态菜单就是可以灵活的在 Activity类中添加和修改菜单项
package cn.android.menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class MenuTest4 extends Activity {
private static final int SAVE=1;
private static final int SAVE_AS=SAVE+1;
//private static final int CLOSE=SAVE+2; //菜单项id
//private static final int SUBMENU=SAVE+3;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.first_menu, menu);
menu.add(1,SAVE,1,"保存");
menu.add(1,SAVE_AS,2,"另存为");
//menu.add(1,CLOSE,3,"关闭");
//menu.add(1,SUBMENU,4,"子菜单");
menu.findItem(SAVE).setIcon(R.drawable.ic_launcher);//给菜单项加图标
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "另存为", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
此代码执行后是这样的:
下面的代码就体现出了 随机添加了!
package cn.android.menu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class MenuTest4 extends Activity {
private static final int SAVE=1;
private static final int SAVE_AS=SAVE+1;
//private static final int CLOSE=SAVE+2;
//private static final int SUBMENU=SAVE+3;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.first_menu, menu);
menu.add(1,SAVE,1,"保存");
menu.add(1,SAVE_AS,2,"另存为");
//menu.add(1,CLOSE,3,"关闭");
//menu.add(1,SUBMENU,4,"子菜单");
menu.findItem(SAVE).setIcon(R.drawable.ic_launcher);
return true;
}
int i =0;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = menu.findItem(SAVE_AS);
item.setTitle(item.getTitle()+""+i);
i++;
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case 1:
Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "另存为", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
另存为 每次都加1;