Android中的Menu的简介(翻译自官方文档)——————个人笔记

菜单分为三种:
Option Menu 11之后使用ActionBar来代替
Context Menu
Popup Menu


1、使用xml来定义一个Menu
   好处:
       在xml中菜单的结构更加清晰
  把应用的行为跟菜单的内容分离
  能让开发者适配不同的屏幕尺寸
  
  eg:
  <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/new_game"
 android:icon="@drawable/ic_new_game"
 android:title="@string/new_game"
 android:showAsAction="ifRoom"/>
<item android:id="@+id/help"
 android:icon="@drawable/ic_help"
 android:title="@string/help" />
</menu>
其中showAsAction ifRoom indicate "Only place this item in the Action Bar if there is room for it."
在菜单项同时指定icon和title属性的时候,默认只是显示icon,这是想要显示两者,可以在showAsAction中添加:withText.
同时,可以使用always来时菜单项常驻,但是窄屏手机就会有问题,造成布局混乱

2、创建一个OptionMenu
   在2.3以前的版本中,菜单键会调出optionMenu,默认为六个菜单,多余的会在more中出现
   在3.0以后的版本中,optionMenu可以使用ActionBar来实现,默认是在OverFlow中
   
   步骤:
       a.初始化菜单选项,在要实现的activity或者fragment中重写onOptionMenuCreate()方法,在方法中去inflate菜单
      eg:
  @Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
  b.为菜单添加选中事件处理。
    当选中菜单的时候,系统会调用Activity的onOptionsItemSelected()方法,在这个方法中会传入被选中的item(MenuItem)
通过getItemId()方法,可以获取选中菜单的id
当成功处理一个菜单事件之后,需要返回true,默认返回false
 
如果在Activity中包含Fragment,则先调用Activity中的onOptionsItemSelected()方法,
在去调用fragment中的onOptionsItemSelected()方法,按照添加的顺序,如果返回true之后则不会往下调用
 
  c.动态修改菜单
    在 onPrepareOptionsMenu()中会传入一个Menu对象,通过这个对象可以进行对menu进行改变
在2.3之前的系统中,每一次调用optionmenu的时候onPrepareOptionsMenu()这个方法都会调用一次。
在3.0以后的系统中,必须调用invalidateOptionMenu()才会调用这个方法。
3、创建一个ContextMenu
   常用于像listView或者GridView这样的视图组中。
   两种方式来实现:
    1.floating context menu   一种漂浮的menu
2.contextual action mode 这种是在3.0之后的版本

a.创建一个floating context menu 
 1.要添加的视图先注册一下,调用registerForContextMenu方法来注册
 2.重写onCreateContextMenu方法初始化菜单,eg:
    @Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
 3.重写onContextItemSelected方法,处理选中菜单项事件处理
 eg:
   @Override
public boolean onContextItemSelected(MenuItem item) {
int itemid = item.getItemId();
if(R.id.item_one==itemid){
Toast.makeText(this, "选中了选项一", Toast.LENGTH_LONG).show();
return true;
}
return false;
}
ps:当不进行处理的时候调用父类的方法,或者处理成功的时候返回true

4.使用contextual action mode
a.为某一个视图添加contextual action mode 
b.批量添加 如:为listView or gridView的每一个选项添加
 
a.为某一个视图添加contextual action mode
  1.实现ActionMode.Callback这个接口
    接口中的方法:
             onCreateActionMode 在创建的时候调用,或者调用startActionMode的时候
 onPrepareActionMode  每次显示ActionMode的时候调用, 当没有做任何处理时,返回false
 onActionItemClicked  处理选中事件
 onDestroyActionMode  退出的时候调用,通常把ActionMode设置为null
  2.当想显示ActionMode的时候调用startActionMode()方法,这个方法返回ActionMode对象。
  
  
     b.批量添加
   1.把要添加的listView或GridView調用setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL)
2. setMultiChoiceModeListener(),實現AbsListView.MultiChoiceModeListener 這個接口

5.創建popub menu
   popubmenu是在3.0以後提供的Api
     在使用xml生成菜單的時候的步驟:
 a.新建一個PopupMenu對象
 b.膨脹menu的xml
 c.show
 eg:
 PopupMenu popup = new PopupMenu(this, v);
 MenuInflater inflater = popup.getMenuInflater();
      inflater.inflate(R.menu.actions, popup.getMenu());
      popup.show();
 
 d.处理点击事件
  popup.setOnMenuItemclickListener()来设置事件的监听
 
 
6.创建菜单组
  eg:
  <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_save"
 android:icon="@drawable/menu_save"
 android:title="@string/menu_save" />
<!-- menu group -->
<group android:id="@+id/group_delete">
<item android:id="@+id/menu_archive"
 android:title="@string/menu_archive" />
<item android:id="@+id/menu_delete"
 android:title="@string/menu_delete" />
</group>
</menu>

分组只是利于分组进行操作:
setGroupVisible()   显示或隐藏菜单组
setGroupEnabled()    使菜单组生效或失效
setGroupCheckable()  选中或不选中菜单组


7.添加意图菜单项

参考官方文档中的:UI中的Menu

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值