Android Menu

OptionsMenu(选项菜单)

1.重写Activity的onCreateOptionsMenu(Menu menu)方法,在该方法里调用Menu对象的方法来添加菜单项或子菜单。

2.如果希望应用程序能响应菜单项的单击事件,重写Activity中的onOptionsItemSelected(MenuItem item)方法即可。

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
    }
    //Options菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	//通过Activity得到填充Menu的填充器
        getMenuInflater().inflate(R.menu.main, menu);
        /**给Option添加item
         * 参数1:分组的ID
         * 参数2:该item的ID
         * 参数3:添加顺序,从0开始
         * 参数4:item显示的文本*/ 
        menu.add(Menu.NONE, 1, 0, "0");
        menu.add(Menu.NONE, 2, 2, "2");
        menu.add(Menu.NONE, 4, 5, "5");
        SubMenu subMenu = menu.addSubMenu("我还能点");
        subMenu.add(Menu.NONE, 3, 6, "我是一个子选项");
        //返回true显示菜单,返回false隐藏菜单
        return true;
    }
    //给Option添加事件监听
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {//按下menu键触发该方法
    	switch (item.getItemId()) {
		case R.id.d:
				Toast.makeText(this, "d", 0).show();
			break;

		case R.id.dmxy:
			Toast.makeText(this, "dmxy", 0).show();
			break;
		case R.id.dom:
			Toast.makeText(this, "dom", 0).show();
			break;
		case 2:
			Toast.makeText(this, "2", 0).show();
			break;
		default:
			break;
		}
        return super.onOptionsItemSelected(item);
    }
}

main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menudemo.MainActivity" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="@string/action_settings"/>
    <item
        android:id="@+id/dmxy"
        android:title="德玛西亚1"/>
    <item
        android:id="@+id/dom"
        android:title="德玛西亚2"/>
    <item
        android:id="@+id/d"
        android:title="0xml"
        android:orderInCategory="0"/>
</menu>
根节点必须为menu才能够正确的解析。上述可以看出来,order是指添加完事,放在哪个位置的一个排序:不写默认是第一个(两个都不写按照XML先后顺序),XML和Java代码中顺序相同则先加载XML的。其余的按照升序排序。

效果图:


ContextMenu(上下文菜单)

1.重写Activity的onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)方法

2.调用Activity的registerForContextMenu(View view)方法给view组件注册上下文菜单。

3.如果系统事件能为菜单项提供响应,可以重写onContextItemSelected(MenuItem item)方法,或为指定菜单项绑定事件监听器。


MainActivity.java

public class MainActivity extends Activity {
	private Button b;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		b = (Button) findViewById(R.id.btn);
		registerForContextMenu(b);

	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		menu.add(Menu.NONE, 1, 1, "红色");
		menu.add(Menu.NONE, 2, 2, "蓝色");
		menu.add(Menu.NONE, 3, 3, "绿色");
		menu.add(Menu.NONE, 4, 4, "紫色");
		//给这四个菜单项设置为单选的
		menu.setGroupCheckable(0, true, true);
		//设置上下文的标题和图标
		menu.setHeaderIcon(R.drawable.ic_launcher);
		menu.setHeaderTitle("选择背景色");
		super.onCreateContextMenu(menu, v, menuInfo);
	}
	
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		return super.onContextItemSelected(item);
	}
}
上下文菜单需要长按才能够触发。

效果图:



PoputMenu弹出菜单

1.调用new PopupMenu(Context context, View anchor)创建下拉菜单,android代表要激活该组件弹出菜单的组件。

2.调用PopupMenu的inflate()方法显示弹出式菜单

3.调用PopupMenu的show()方法显示弹出式菜单


MainActivity.java

public class MainActivity extends Activity {
	private Button b;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		b = (Button) findViewById(R.id.btn);
	}

	public void btn(View view) {
		// 创建PopupMenu对象
		PopupMenu menu = new PopupMenu(this, b);
		// 将菜单的XML资源文件加载到popup菜单中
		getMenuInflater().inflate(R.menu.popup_menu, menu.getMenu());
		// 添加事件监听
		menu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
			@Override
			public boolean onMenuItemClick(MenuItem item) {
				switch (item.getItemId()) {
				case R.id.add:
					Toast.makeText(MainActivity.this, "添加", 0).show();
					break;
				case R.id.del:
					Toast.makeText(MainActivity.this, "删除", 0).show();
					break;
				}
				return false;
			}
		});
		menu.show();

	}
}
popup_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/add"
        android:title="添加"/>
    <item
        android:id="@+id/del"
        android:title="删除"/>
    <item
        android:id="@+id/update"
        android:title="修改"/>
    <item
        android:id="@+id/sele"
        android:title="查询"/>

</menu>

弹出式菜单单击即可。


效果图:




总结:

1.选项菜单order是由数值来决定的,越小越靠前,不给定数值在最前面。手机按键menu和右上角都可以打开选项菜单

2.上下文菜单需要长按才能够触发

3.弹出式菜单需要单击即可触发

前两者都在Activity中重写方法实现的,后者是需要Context参数即可实现。









你可能感兴趣的:(contextMenu,menu,PopupMenu,optionsMenu)