android的menu使用

老罗视频学习笔记。



一.普通的menu。


在onCreateOptionsMenu函数中为menu添加menu项。

代码如下:

@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		
		//用MenuItem对象来表示添加的menu项,通过MenuItem对象来操作
		MenuItem menuItem1 = menu.add(1001, ITEM1, 1, "菜单测试1");
		
		MenuItem menuItem2 = menu.add(1002, ITEM2, 2, "菜单测试2");
		//没作用menuItem2.setIcon(R.drawable.t2);
		menuItem2.setTitle("菜单2修改后");
		
		return super.onCreateOptionsMenu(menu);

	}

当选择了一项menu时,会在onMenuItemSelected或者onOptionsItemSelected回调。

如下即可:

switch (item.getItemId()) {
		case ITEM1:
			Toast.makeText(MainActivity.this, "点击了菜单1", Toast.LENGTH_SHORT).show();
			break;
		case ITEM2:
			Toast.makeText(MainActivity.this, "点击了菜单2", Toast.LENGTH_SHORT).show();
			break;
		default:
			break;


二.用res->menu->下的xml布局文件来显示menu。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.android_menu.MainActivity" >
<!-- 
android:showAsAction="never"表示不会再标题栏显示 
"ifRoom|withText"表示在标题栏有位置的话显示并且显示标题-->
    <item
        android:id="@+id/sys"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:icon="@drawable/t1"
        android:title="系统菜单">
        <menu >
            <item android:id="@+id/create_new"
                android:title="新建文件"/>
            <item android:id="@+id/open"
                android:title="打开文件"/>
            
        </menu>
</item>

        <item
        android:id="@+id/user"
        android:orderInCategory="101"
        android:showAsAction="never"
        android:icon="@drawable/t2"
        android:title="用户菜单">
        <menu >
            <group android:id="@+id/group1">
            			<item android:id="@+id/load"
                				android:title="加载文件"/>
            </group>
            <group android:id="@+id/group2">
            			<item android:id="@+id/save"
                				android:title="保存文件"/>
            </group>
        </menu>
</item>
    
</menu>


onCreateOptionsMenu函数中一句话就可以了

getMenuInflater().inflate(R.menu.main, menu);

布局文件中android:showAsAction="ifRoom|withText"如果是never的话,会在menu键点击时显示,如果为ifRoom会在标题栏显示的,

当选择了一项menu时,会在onMenuItemSelected或者onOptionsItemSelected回调。和上边方法一样。


效果如下:

如果不在标题栏显示:那么点击后会显示在屏幕中心



如果在标题栏显示是这样的





三.上下文菜单,contextMenu

除了上边说的Activity的optionsMenu外,还有一种长按视图后会显示的菜单,叫做contextMenu菜单

就是先在主界面写一个view布局,例如listview。长按其中一项时会弹出menu菜单,但是这个view必须用registerForContextMenu(listView)函数注册上下文。否则无法弹出menu。

在oncreate函数中设置listview。

private ListView listView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		listView = (ListView)findViewById(R.id.listView1);
		
		ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1,getData());
		listView.setAdapter(arrayAdapter);
		//必须要给listview注册上下文菜单
		registerForContextMenu(listView);
	}

getData函数如下:

public List<String> getData(){
		
		List<String> list = new ArrayList<String>();
		for(int i = 0;i<7;i++){
			list.add("jack"+i);
		}
		return list;
		
	}

上下文菜单是用onCreateContextMenu函数来创建的。



public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		// TODO Auto-generated method stub
		super.onCreateContextMenu(menu, v, menuInfo);
		
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.menu.contentmenu, menu);
	}

响应菜单选项是用onContextItemSelected函数实现的。


@Override
	public boolean onContextItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		
		
		switch (item.getItemId()) {
		case R.id.edit:
			Toast.makeText(MainActivity.this, "点击了edit", Toast.LENGTH_SHORT).show();
			break;
		case R.id.save:
			Toast.makeText(MainActivity.this, "点击了save", Toast.LENGTH_SHORT).show();
			break;
		default:
			break;
			}
		return super.onContextItemSelected(item);
	}


效果图如下:



四.ActionModel menu。

长按按钮或者别的控件时 ,会在标题栏提供可以选择的menu。


首先定义一个ActionMode对象。

private ActionMode actionMode;

在oncreate函数中给按钮设置长按点击事件。


actionmodelmenu = (Button)findViewById(R.id.button1);
		//给按钮绑定一个长按的点击事件
		actionmodelmenu.setOnLongClickListener(new OnLongClickListener() {
			
			@Override
			public boolean onLongClick(View v) {
				// TODO Auto-generated method stub
				if(actionMode!=null){
					return false;
				}
				actionMode = startActionMode(actionCallback);
				v.setSelected(true);
				return true;
			}
		});

上边代码的回调函数如下:

private ActionMode.Callback actionCallback = new ActionMode.Callback() {
		
		@Override
		public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
			// TODO Auto-generated method stub
			return false;
		}
		//菜单销毁时会调用这个函数,
		@Override
		public void onDestroyActionMode(ActionMode arg0) {
			// TODO Auto-generated method stub
			actionMode = null;//菜单销毁时置空
		}
		//表示我们要从xml文件中加载菜单
		@Override
		public boolean onCreateActionMode(ActionMode arg0, Menu menu) {
			// TODO Auto-generated method stub
			MenuInflater menuInflater = getMenuInflater();
			menuInflater.inflate(R.menu.contentmenu, menu);//加载xml布局menu
			return true;
		}
		//在这个函数里捕获用户的选项操作
		@Override
		public boolean onActionItemClicked(ActionMode arg0, MenuItem item) {
			// TODO Auto-generated method stub
			switch (item.getItemId()) {
			case R.id.edit:
				Toast.makeText(MyActionModeMenu.this, "点击了edit", Toast.LENGTH_SHORT).show();
				
				break;
			case R.id.save:
				Toast.makeText(MyActionModeMenu.this, "点击了save", Toast.LENGTH_SHORT).show();
				break;
			default:
				break;
				}
			return true;
		}
	};

实现效果如下:

本来是这样:



长按ActionModel按钮:



五.popup menu。

点击按钮后会显示菜单选项。

给按钮设置点击事件,普通点击事件即可。

onMenuItemClick函数就是用户选择的项的处理事件。

popupmenu.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				PopupMenu popupMenu = new PopupMenu(MyActionModeMenu.this,v);
				popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
					//在这里处理用户选择的项
					@Override
					public boolean onMenuItemClick(MenuItem item) {
						// TODO Auto-generated method stub
						
						switch (item.getItemId()) {
						case R.id.edit:
							Toast.makeText(MyActionModeMenu.this, "点击了edit", Toast.LENGTH_SHORT).show();
							
							break;
						case R.id.save:
							Toast.makeText(MyActionModeMenu.this, "点击了save", Toast.LENGTH_SHORT).show();
							break;
						default:
							break;
							}
						
						return true;
					}
				});


然后显示菜单就可以了

MenuInflater menuInflater = popupMenu.getMenuInflater();
				menuInflater.inflate(R.menu.contentmenu, popupMenu.getMenu());
				popupMenu.show();//显示菜单

效果如下:




这里有几篇链接讲解的非常清楚:

Android菜单详解(一)——理解android中的Menu

Android菜单详解(二)——创建并响应选项菜单

Android菜单详解(三)——SubMenu和IconMenu

Android菜单详解(四)——使用上下文菜单ContextMenu

Android菜单详解(五)——使用XML生成菜单


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值