Android-Menu

Android系统里存在三种菜单,分别是options menu,context menu,sub menu,下面分别做介绍:

1. options menu + sub menu

点击android手机上的menu按键时显示,options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menuicon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件。菜单项多于6个会以“more” icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样。Activity里面,一般通过以下函数来使用options menu

Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用。

Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用。

Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。

java代码:

public class MainActivity extends Activity {
	ActionBar actionBar;
	TextView menuTitle;
	private static final  int  MENU_ITEM1 = Menu.FIRST;
	private static final  int  MENU_ITEM2 = Menu.FIRST+1;
	private static final  int  MENU_ITEM3 = Menu.FIRST+2;
	private static final  int  MENU_ITEM4 = Menu.FIRST+3;
	private static final  int  MENU_ITEM5 = Menu.FIRST+4;
	private static final  int  MENU_ITEM6 = Menu.FIRST+5;
	private static final  int  MENU_ITEM7 = Menu.FIRST+6;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        menuTitle = (TextView)findViewById(R.id.menu_title);
        actionBar = getActionBar();
        actionBar.show();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
	//   以xml文件的形式加载menu菜单
	//   getMenuInflater().inflate(R.menu.main, menu);
    	/*menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)
    	groupId:组别,如果不分组的话就写Menu.NONE
	itemId:菜单项Id,这个很重要,Android根据这个Id来确定不同的菜单 
        order:顺序,哪个菜单项在前面由这个参数的大小决定 
	title:文本,菜单项的显示文本*/
    	MenuItem item1 = menu.add(0, MENU_ITEM1, MENU_ITEM1, R.string.item1);
        MenuItem item2 = menu.add(0, MENU_ITEM2, MENU_ITEM2, R.string.item2);
        MenuItem item3 = menu.add(0, MENU_ITEM3, MENU_ITEM3, R.string.item3);
        menu.add(0, MENU_ITEM4, MENU_ITEM4, R.string.item4);
        menu.add(0, MENU_ITEM5, MENU_ITEM5, R.string.item5);
        menu.add(0, MENU_ITEM6, MENU_ITEM6, R.string.item6).setIcon((R.drawable.ic_launcher));
        
        SubMenu subMenu = menu.addSubMenu(0,0,Menu.NONE,"SubMenu");
        subMenu.setHeaderIcon(R.drawable.ic_launcher);
        subMenu.setIcon(R.drawable.ic_launcher);
        //为子菜单添加一个菜单项
        subMenu.add(0,0,Menu.NONE,"Submenu Item");
    	
        //ActionBar如果有多余空间,菜单项会显示在ActionBar中
        item1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        
        item2.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
			
			@Override
			public boolean onMenuItemClick(MenuItem arg0) {
				menuTitle.setText("点击了" + arg0.getTitle());
				return false;
			}
		});
        //当单击一个事件菜单后,该事件既没有被MenuItemClickListener处理,也没有被OptionsItemSelected处理,就会触发分配给这个菜单项的Intent.
        item3.setIntent(new Intent(this,MainActivity.class));
    	
        return true;
    }

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		 switch (item.getItemId()) {
		 	case MENU_ITEM3:
	            Toast.makeText(getApplicationContext(),
	                    "MENU_ITEM3", Toast.LENGTH_SHORT).show();
	            break;
	        case MENU_ITEM4:
	            Toast.makeText(getApplicationContext(),
	                    "MENU_ITEM4", Toast.LENGTH_SHORT).show();
	            break;
	        default:break;
	        }
	        return false;
	}
<span style="white-space:pre">	</span>//每次显示菜单的时候会调用onPrepareOptionsMenu,根据程序的运行状态,可以对菜单进行动态的更改,可以动态地启用/禁用每一个菜单项
    @Override
    public boolean onPrepareOptionsMenu(Menu menu){
        super.onPrepareOptionsMenu(menu);
        return true;
    }
}
若要在XML文件中编写menu文件,则在 Activity::onCreateOptionsMenu (Menu menu)通过getMenuInflater().inflate(R.menu.main, menu)进行加载。

menu的xml文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/item1"
        android:orderInCategory="1"
        android:title="@string/item1"
        android:showAsAction="ifRoom"
        />
    <item
        android:id="@+id/item2"
        android:orderInCategory="2"
        android:title="@string/item2"/>
    
    <!-- 表示的是二级菜单 -->
    <item
        android:id="@+id/sub_menu"
        android:orderInCategory="0"
        android:title="@string/sub_menu">
        <menu>
            <item
                android:id="@+id/sub_menu1"
                android:alphabeticShortcut="n"
                android:title="@string/sub_menu1"
                android:visible="true"/>
            <item
                android:id="@+id/sub_menu2"
                android:alphabeticShortcut="g"
                android:title="@string/sub_menu2"
                android:visible="true"/>
        </menu>
    </item>
</menu>
2. context menu + sub menu

context menu与相应的view绑定在一起,不支持快捷键和icon图标,Activity里面,一般通过以下函数来使用context menu

Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。

Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context menu每次显示时都会调用这个函数。

Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。

为view注册context menu的java代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
         ......
        //为一个View注册一个上下文菜单
        registerForContextMenu(menuEdit);
        registerForContextMenu(menuTitle);
    }
context menu被创建的java代码:

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		menu.add(GROUP_NUM1, CONTEXT_MENU_ITEM1, Menu.NONE, "checkbox1-group1").setCheckable(true).setChecked(true);
		menu.add(GROUP_NUM1, CONTEXT_MENU_ITEM2, Menu.NONE, "checkbox2-group1").setCheckable(true).setChecked(false);
		
		menu.add(GROUP_NUM2, CONTEXT_MENU_ITEM1, Menu.NONE, "radiobox1-group2").setChecked(true);
		menu.add(GROUP_NUM2, CONTEXT_MENU_ITEM1, Menu.NONE, "radiobox2-group2").setChecked(false);
		
		//函数原型setGroupCheckable(int group, boolean checkable,boolean exclusive)
        menu.setGroupCheckable(GROUP_NUM2, true, true);// 这句话要写在groupitem的最后。
		
	}
若要在XML文件中编写context menu文件,则在 Activity::onCreateOptionsMenu (Menu menu)通过getMenuInflater().inflate(R.menu.main, menu)进行加载。

效果截图(手指触及view两秒左右context menu弹出):




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值