《老罗Android》学习 Menu菜单

本讲内容:菜单 menu 
1、选项菜单 OptionsMenu 
2、上下文菜单 ContextMenu 
3、子菜单 SubMenu
1. 选项菜单 OptionsMenu 
 OptionsMenu 菜单的创建方式有两种:一种是在程序中用Java代码创建一个Options Menu; 一种是在XML中定义。
1.1 方式一:代码创建
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 使用java代码实现菜单
MenuItem menuItem = menu.add(1001, 100, 1, "系统菜单");
menuItem.setTitle("菜单一");
MenuItem menuItem2 = menu.add(1001, 101, 2, "用户菜单");
menuItem2.setTitle("菜单二");// 最多可以显示6个子菜单
MenuItem menuItem3 = menu.add(1001, 102, 2, "客户菜单");
menuItem3.setTitle("菜单三");// 最多可以显示6个子菜单
menuItem3.setShortcut('c', 'c');// 给指定的菜单设置快捷键
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	case 100:
	Intent intent = new Intent(MainActivity.this, NextActivity.class);
	item.setIntent(intent);
	break;
	case 101:
	Toast.makeText(MainActivity.this, "选择了菜单二", 1).show();
	break;
	case 102:
	Toast.makeText(MainActivity.this, "选择了菜单三", 1).show();
	break;
	}
	return super.onOptionsItemSelected(item);
}
2.方式二:在XML中定义
1.  在/res/menu目录下新建 xml文件。
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/menu_settings"
        android:icon="@drawable/sys"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/menu_settings">
        <menu>
            <item
                android:id="@+id/create_new"
                android:title="新建文件">
            </item>
            <item
                android:id="@+id/open"
                android:title="打开文件"/>
        </menu>
    </item>
    <item
        android:id="@+id/sys"
        android:icon="@drawable/sys"
        android:orderInCategory="101"
        android:showAsAction="never"
        android:title="用户菜单">
      <menu>
        <group android:id="@+id/group1" >
        <item
         android:id="@+id/load"
         android:title="加载文件">
    </item>
        </group>
       <group android:id="@+id/group2" >
           <item
                 android:id="@+id/save"
                 android:title="保存文件">
           </item>
      </group>
   </menu>
 </item>
</menu>
						

					
				

2. 在MainActivity中操作
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);//找到menu的xml文件
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case R.id.create_new://在XML文件中定义的id
   Intent intent = new Intent(MainActivity.this, SystemMenu.class);
   item.setIntent(intent);
break;
case R.id.open:
   Toast.makeText(MainActivity.this, "打开菜单", 1).show();
break;
case R.id.load:
   Toast.makeText(MainActivity.this, "加载菜单", 1).show();
break;
case R.id.save:
   Toast.makeText(MainActivity.this, "保存菜单", 1).show();
break;
}
 return super.onMenuItemSelected(featureId, item);
}
一般是在xml中来创建optionsMenu,这样可以匹配不同屏幕等等优势。
OptionsMenu的应用也可以参考这篇文章:OptionMenu操作
 一级菜单 二级菜单 效果图:



2. 上下文菜单 ContextMenu 
  可以找到API文档的说明,在User Interface--->Menus--->Creating Contextual Menus.
  上下文菜单很像一个浮动窗口。你可以为任何一个View提供context menu,但一般在ListView和GridView上用的比较多。
  在桌面电脑,我们都很熟悉Context menu,按鼠标右键显示的菜单就是context菜单。在Android中,通过长时间鼠标按键可以触发context菜单。对于触屏设备,手指长按就是长鼠标按键事件。
  一个activity有且只有一个OptionMenu,一个view有且只有一个ContextMenu。检查鼠标长按是基于view来监听。因此一个activity中可有多少个view,就可以有多少个ContextMenu。
  下面用一个例子,演示一下怎么操作 context menu.

1. 在MainActivity中的操作
public class MainActivity extends Activity {
 private ListView listView;
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 listView = (ListView) this.findViewById(R.id.listView1);
 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
 android.R.layout.simple_list_item_1, getData());

 listView.setAdapter(adapter);
//给ListView注册上下文菜单
 registerForContextMenu(listView);//View类型
}
public List<String> getData() {
 List<String> list = new ArrayList<String>();
 for (int i = 1; i <= 7; i++) {
 list.add("jack" + i);
}
 return list;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// 加载xml中的上下文菜单
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);

}
//响应上下文菜单的操作
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
  case R.id.delete:
    Toast.makeText(MainActivity.this, "Delete", 1).show();
    break;
case R.id.share:
    Toast.makeText(MainActivity.this, "Share", 1).show();
    break;
case R.id.edit:
   Toast.makeText(MainActivity.this, "Edit", 1).show();
   break;
}
  return super.onContextItemSelected(item);
}
}

2. menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/edit"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="Edit"/>
    <item
        android:id="@+id/share"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="Share"/>
    <item
        android:id="@+id/delete"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="Delete"/>
</menu>
			
效果图:

这部分知识也可以参考这篇文章:Android 菜单(ContextMenu)



			

3. ActionMode
  在高版本一般用ActionMode来替换浮动的context menu。它可以显示在屏幕的顶端来执行用户的一些操作,长键,复选框全选都可以用这个来完成。
下面我们用一个例子来显示其操作方法,也要有一个menu的xml文件,我们就用上面那个xml文件吧。

其Activity中的操作如下:长按一个按钮时,出现actionmode操作。
private ActionMode actionMode;   // 使用ActionMode完成菜单操作
button = (Button) this.findViewById(R.id.button1);
//一定要是长按事件
button.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
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 mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
}
// 表示我们要加载菜单,从xml中加载
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_main, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.edit:
edit();
break;
case R.id.delete:
Toast.makeText(MainActivity.this, "Delete", 1).show();
break;
case R.id.share:
Toast.makeText(MainActivity.this, "Share", 1).show();
break;
}
return false;
}
};
public void edit() {
Toast.makeText(MainActivity.this, "Edit", 1).show();
}


4. PopupMenu
Popup Menu弹出显示在控件的上方或下方。不用长按,点一下就会触发。

button2 = (Button)this.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
	PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);
	popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
	@Override
	public boolean onMenuItemClick(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.edit:
			edit();
			break;
		case R.id.delete:
		Toast.makeText(MainActivity.this, "Delete", 1).show();
			break;
		case R.id.share:
			Toast.makeText(MainActivity.this, "Share", 1).show();
			break;
			}
			return false;
			}
		});
		MenuInflater inflater = popupMenu.getMenuInflater();
		inflater.inflate(R.menu.activity_main, popupMenu.getMenu());
		popupMenu.show();//显示菜单
	}
});

     在平板电板上,没有菜单按键出现,解决方法想看这篇文章:平板电脑没有出现menu 按键显示 解决
    还可以用独立按键的方式打开Menu菜单:android 独立按键和菜单键 打开menu



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值