绳锯木断,水滴石穿。—— 罗大经《鹤林玉露》


本讲内容:菜单 Android Menu

在Android中,菜单被分为如下三种:

选项菜单(OptionsMenu):

上下文菜单(ContextMenu):长按跳出菜单

子菜单(SubMenu):点击选项菜单将弹出悬浮窗口显示子菜单项。


一、ContextMenu与OptionMenu的区别
1、OptionMenu对应的是activity,一个activity只能拥有一个选项菜单。
2、ContextMenu对应的是View,每个View都可以设置上下文菜单。
3、一般情况下ContextMenu常用于ListView或者GridView.

ContextMenu的组成:1、标题以及标题图标  2、菜单内容  3、菜单内容的点击事件

ContextMenu创建方法:首先给View注册上下文菜单registerForContextMenu(),然后添加菜单项。


示例一:选项菜单(通过xml加载)注意:api>=11 菜单不支持显示图标

android menu 样式 android menu菜单_android menu 样式


下面是res/menu/main.xml 文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_set"
        android:title="@string/action_set"/>
    <item
        android:id="@+id/menu_help"
        android:title="@string/action_help"/>

</menu>

注意:如果不引用@string可能会导致程序总无法自动在R.java中生成相应的ID。


下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	// 创建选项菜单
	public boolean onCreateOptionsMenu(Menu menu) {
	// 通过getMenuInflater()方法得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了
		getMenuInflater().inflate(R.menu.main, menu);
		// 返回true表示允许创建的菜单显示出来
		return true;
	}

	// 选项菜单响应事件
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_set:
			Toast.makeText(this, "设置", Toast.LENGTH_LONG).show();
			break;
		case R.id.menu_help:
			Toast.makeText(this, "帮助", Toast.LENGTH_LONG).show();
			break;
		}
		return true;
	}

}


示例二:选项菜单(通过java加载)

android menu 样式 android menu菜单_xml_02

 

android menu 样式 android menu菜单_java_03

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(1, 100, 1, "设置");
		menu.add(1, 101, 1, "帮助");
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 100:
			//跳转activity
			Intent intent = new Intent(MainActivity.this, SecondActivity.class);
			item.setIntent(intent);//设置点击意图
			break;
		case 101:
			Toast.makeText(MainActivity.this, "点击了帮助", Toast.LENGTH_SHORT).show();
			break;
		}
		return super.onOptionsItemSelected(item);
	}
}




示例三:上下文菜单

android menu 样式 android menu菜单_java_04

 

android menu 样式 android menu菜单_android_05

下面是res/layout/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" >

    <ListView 
        android:id="@+id/id_listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>




下面是res/menu/main.xml  文件:


<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/context_menu_item1"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="复制"/>
    <item
        android:id="@+id/context_menu_item2"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="粘贴"/>
    <item
        android:id="@+id/context_menu_item3"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="剪切"/>
    <item
        android:id="@+id/context_menu_item4"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="重命名"/>

</menu>


下面是MainActivity.java主界面文件:


public class MainActivity extends Activity {
	private ListView listView;
	private List<String> listData;
	ArrayAdapter<String> adapter;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView=(ListView) findViewById(R.id.id_listView);
		adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,getData());
		listView.setAdapter(adapter);
		//注册上下文菜单
		this.registerForContextMenu(listView);
	}

	/**
	 * 创建上下文菜单
	 */
	public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		//设置Menu显示内容
		menu.setHeaderTitle("文件操作");
		menu.setHeaderIcon(R.drawable.ic_launcher);
//		menu.add(1, 1, 1, "复制");
//		menu.add(1, 2, 1, "粘贴");
//		menu.add(1, 3, 1, "剪切");
//		menu.add(1, 4, 1, "重命名");
		getMenuInflater().inflate(R.menu.main, menu);
	}
	
	/**
	 * 上下文菜单响应事件
	 */
	public boolean onContextItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.context_menu_item1:
			Toast.makeText(MainActivity.this, "点击复制",Toast.LENGTH_SHORT).show();
			break;
		case R.id.context_menu_item2:
			Toast.makeText(MainActivity.this, "点击粘贴",Toast.LENGTH_SHORT).show();
			break;
		case R.id.context_menu_item3:
			Toast.makeText(MainActivity.this, "点击剪切",Toast.LENGTH_SHORT).show();
			break;
		case R.id.context_menu_item4:
			Toast.makeText(MainActivity.this, "点击重命名",Toast.LENGTH_SHORT).show();
			break;
		}
		
		return super.onContextItemSelected(item);
	}
	
	/**
	 * listView数据源
	 */
	private List<String> getData(){
		listData=new ArrayList<String>();
		for(int i=0;i<5;i++){
			listData.add("文件"+(i+1));
		}
		return listData;
	}
}




示例四:SubMenu

android menu 样式 android menu菜单_android_06

 

android menu 样式 android menu菜单_java_07

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public boolean onCreateOptionsMenu(Menu menu) {
		SubMenu file = menu.addSubMenu("文件");
		SubMenu edit = menu.addSubMenu("编辑");
		file.setHeaderTitle("文件操作");//子菜单标题
		file.setHeaderIcon(R.drawable.ic_launcher);//子菜单图标
		file.add(1, 1, 1, "新建");
		file.add(1, 2, 1, "打开");
		file.add(1, 3, 1, "保存");
		edit.setHeaderTitle("编辑操作");
		edit.setHeaderIcon(R.drawable.ic_launcher);
		edit.add(2, 1, 1, "复制");
		edit.add(2, 2, 1, "粘贴");
		edit.add(2, 3, 1, "剪切");
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		if(item.getGroupId()==1){
			switch (item.getItemId()) {
			case 1:
				Toast.makeText(this, "点击了新建",Toast.LENGTH_SHORT).show();
				break;
			case 2:
				Toast.makeText(this, "点击了粘贴",Toast.LENGTH_SHORT).show();
				break;
			case 3:
				Toast.makeText(this, "点击了剪切",Toast.LENGTH_SHORT).show();
				break;
			}
		}else if(item.getGroupId()==2){
			switch (item.getItemId()) {
			case 1:
				Toast.makeText(this, "点击了新建",Toast.LENGTH_SHORT).show();
				break;
			case 2:
				Toast.makeText(this, "点击了粘贴",Toast.LENGTH_SHORT).show();
				break;
			case 3:
				Toast.makeText(this, "点击了剪切",Toast.LENGTH_SHORT).show();
				break;
			}
		}
		return super.onOptionsItemSelected(item);
	}
}

示例五:SubMenu(xml)

下面是res/menu/main.xml  文件:


<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:showAsAction="never"
        android:title="文件">
        <menu>
            <item
                android:id="@+id/new_file"
                android:showAsAction="never"
                android:title="新建"/>
            <item
                android:id="@+id/open_file"
                android:showAsAction="never"
                android:title="打开"/>
            <item
                android:id="@+id/save_file"
                android:showAsAction="never"
                android:title="保存"/>
        </menu>
    </item>
    <item
        android:showAsAction="never"
        android:title="编辑">
        <menu>
            <item
                android:id="@+id/c_edit"
                android:showAsAction="never"
                android:title="复制"/>
            <item
                android:id="@+id/v_edit"
                android:showAsAction="never"
                android:title="粘贴"/>
            <item
                android:id="@+id/x_edit"
                android:showAsAction="never"
                android:title="剪切"/>
        </menu>
    </item>

</menu>

下面是MainActivity.java主界面文件:


public class MainActivity extends Activity {

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.new_file:
			Toast.makeText(this, "点击了新建",Toast.LENGTH_SHORT).show();
			break;
		case R.id.open_file:
			Toast.makeText(this, "点击了打开",Toast.LENGTH_SHORT).show();
			break;
		case R.id.save_file:
			Toast.makeText(this, "点击了保存",Toast.LENGTH_SHORT).show();
			break;
		case R.id.c_edit:
			Toast.makeText(this, "点击了复制",Toast.LENGTH_SHORT).show();
			break;
		case R.id.v_edit:
			Toast.makeText(this, "点击了粘贴",Toast.LENGTH_SHORT).show();
			break;
		case R.id.x_edit:
			Toast.makeText(this, "点击了剪切",Toast.LENGTH_SHORT).show();
			break;
		}
		return super.onOptionsItemSelected(item);
	}
}






Take your time and enjoy it