Android Menu

Contents

Android-Menu


Menu分三种:

OptionMenu:选择菜单,单击”menu”按键出现。

ContextMenu:上下文菜单,长按出现。

SubMenu:子菜单

一、创建Menu资源:

除了在代码中实例化menu之外,还要在XML中定义所有menuItem的资源。

Menu资源中包含如下属性:

<menu>

<item>

<group>

二、扩展menu resources:

我们可以在代码中通过将xml资源转化为对象来扩展menu资源,如下:

@Override

public boolean onCreateOptionsMenu(Menu menu) {

     MenuInflaterinflater = getMenuInflater();

     inflater.inflate(R.menu.game_menu,menu);

     return true;

}

getMenuInflater()方法返回了一个MenuInflater对象,用此对象来调用inflate()方法,将menu资源填充到menu对象中。


三、创建Option Menu

OptionsMenu中的item可通过“MENU”按键或者actionBarandroid3.0以上)访问。

当第一次创建optionmenu时会调用onCreateOptionsMenu()方法,在该方法中我们用xml资源文件来填充Menu,如上面的例子。

3.1响应用户动作

当用户点击Item时会调用onOptionsItemSelected(),该方法将用户点击的MenuItem传递。我们可以用getItemId()来识别单击的Item。如下所示:

@Override

public boolean onOptionsItemSelected(MenuItem item) {

     //Handle item selection

     switch(item.getItemId()) {

     case R.id.new_game:

         newGame();

         return true;

     case R.id.help:

         showHelp();

         return true;

     default:

     returnsuper.onOptionsItemSelected(item);//将无法处理的操作交给父类来处理是推荐的操作

     }

}

*如果多个activity都拥有相同的menu,我们可以定义一个只实现onCreateOptionsMenu()andonOptionsItemSelected()activity,然后让其他类来继承该类。如果想在子类中添加新的item,则只需重写onCreateOptionsMenu();并super.onCreateOptionsMenu(menu)使原来的Item也被创建,然后add()新的Item即可。

3.2运行时改变MenuItem

onCreateOptionsMenu()只有在menu刚被创建时才会执行,因此要想随时动态改变OptionMenu就要实现onPrepareOptionsMenu()方法,该方法会传给你Menu对象,供使用

Android2.3或更低的版本会在每次Menu打开的时候调用一次onPrepareOptionsMenu().

Android3.0及以上版本默认menu是打开的,所以必须调用invalidateOptionsMenu()方法,然后系统将调用onPrepareOptionsMenu()执行update操作。


*OptionMenu不能根据currentfocus来操作ItemContextMenu可以。


四、创建ContextMenu

ContextMenu当用户长按时出现。ContextMenu必须依赖于某个View,即必须为ContextMenu注册view,调用registerForContextMenu()方法,并传递想要注册的view对象。要想定义ContextMenu的外观和动作必须重写onCreateContextMenu()and onContextItemSelected()两个方法。如下代码所示:

@Override

publicvoid onCreateContextMenu(ContextMenu menu, View v,//用户选择的View

ContextMenuInfo menuInfo){//可附带额外的信息

super.onCreateContextMenu(menu,v, menuInfo);

MenuInflaterinflater = getMenuInflater();

inflater.inflate(R.menu.context_menu,menu);

}

当用户点击某个Item时将执行onContextItemSelected()方法:

@Override

publicboolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfoinfo = (AdapterContextMenuInfo) item.getMenuInfo();//获得选择的item位置

switch(item.getItemId()) {

caseR.id.edit:

editNote(info.id);

returntrue;

caseR.id.delete:

deleteNote(info.id);

returntrue;

default:

returnsuper.onContextItemSelected(item);

}

}

注意:ContextMenu中的Item不支持icons和热键(shotcut keys

五、创建submenus

当创建menusources时可通过在Item下添加<menu>来实现submenu,代码如下:

<?xmlversion="1.0" encoding="utf-8"?>

<menuxmlns:android="http://schemas.android.com/apk/res/android">

<itemandroid:id="@+id/file"

android:icon="@drawable/file"

android:title="@string/file">

<!--"file" submenu -->

<menu>

<itemandroid:id="@+id/create_new"

android:title="@string/create_new"/>

<itemandroid:id="@+id/open"

android:title="@string/open"/>

</menu>

</item>

</menu>

当用户点击submenuItem时,父menu的相应的itemselected方法将做相应。如上例optionMenuonOptionsItemSelected()方法将会响应。

六、Menu的其他特征

6.1 Menu Groups

Menugroups是一系列具有相同特征的Items的集合,通过Menugroups我们可以做如下工作:

  • 显示或者隐藏所有ItemssetGroupVisible()

  • 使Items同时可用或不可用:setGroupEnabled()

  • 使Items同时选民:setGroupCheckable()

我们可以在XML文件中用group来包裹item实现groups,代码如下:

<?xmlversion="1.0" encoding="utf-8"?>

<menuxmlns:android="http://schemas.android.com/apk/res/android">

<itemandroid:id="@+id/item1"

android:icon="@drawable/item1"

android:title="@string/item1"/>

<!--menu group -->

<groupandroid:id="@+id/group1">

<itemandroid:id="@+id/groupItem1"

android:title="@string/groupItem1"/>

<itemandroid:id="@+id/groupItem2"

android:title="@string/groupItem2"/>

</group>

</menu>

6.2可选择的MenuItems

来自图标菜单的Items中不能显示单选或多选按钮。

我们可以为每一个Itemandroid:checkable来定义选择属性,也可以在group中用android:checkableBehavior来定义整体的选择属性。如下:

<?xmlversion="1.0" encoding="utf-8"?>

<menuxmlns:android="http://schemas.android.com/apk/res/android">

<groupandroid:checkableBehavior="single">

<itemandroid:id="@+id/red"

android:title="@string/red"/>

<itemandroid:id="@+id/blue"

android:title="@string/blue"/>

</group>

</menu>

android:checkableBehavior属性可以接受如下三个值:

singlelikeradio buttons

alllikecheckboxes


none

当某个可选的Item被选中时,系统会调用相应的Itemselected返回方法,此时我们必须手动设置当前item的选中状态,因为它本身并不会自动改变。例如:

@Override

publicboolean onOptionsItemSelected(MenuItem item) {

switch(item.getItemId()) {

caseR.id.vibrate:

caseR.id.dont_vibrate:

if(item.isChecked()) item.setChecked(false);

elseitem.setChecked(true);

returntrue;

default:

returnsuper.onOptionsItemSelected(item);

}

}

如果不做如上设置的话,用户选择后,选择结果将不会被保存。

注意:以上设置也只能保证在当前session中有效,如果想应用destroy销毁后仍然有效就要使用SharedPreferences.

6.3热键(shortcutkeys

如果用户有keyboard的话,便可为items设置热键,可以再<Item>中添加android:alphabeticShortcutand android:numericShortcut,也可以在代码中使用setAlphabeticShortcut(char)and setNumericShortcut(char)设置。热键大小写不敏感,不能添加到ContextMenu上。

6.4动态添加menu意图

menuitem想通过Intent调用某一activity时,可能此activity并不存在,因此android允许用户动态为menuItem添加意图

添加可以根据activity是否可用来接受intentItem

  • 定义包含category CATEGORY_ALTERNATIVE and/orCATEGORY_SELECTED_ALTERNATIVEIntent

  • 调用Menu.addIntentOptions()android将自动搜索可执行intent的用的应用并添加到menu

示例代码:

@Override

publicboolean onCreateOptionsMenu(Menu menu){

super.onCreateOptionsMenu(menu);

//Create an Intent that describes the requirements to fulfill, to beincluded

//in our menu. The offering app must include a category value ofIntent.CATEGORY_ALTERNATIVE.

Intentintent = new Intent(null, dataUri);

intent.addCategory(Intent.CATEGORY_ALTERNATIVE);


//Search and populate the menu with acceptable offering applications.

menu.addIntentOptions(

R.id.intent_group, // Menu group to which new items will be added

0, // Unique item ID (none)

0, // Order for the items (none)

this.getComponentName(), // The current activity name

null, // Specific items to place first (none)

intent,// Intent created above that describes our requirements

0, // Additional flags to control items (none)

null); // Array of MenuItems that correlate to specific items (none)


returntrue;

}

6.5允许自己的application被添加到别人的menu

必须定义intent-filter且包含CATEGORY_ALTERNATIVEand/or CATEGORY_SELECTED_ALTERNATIVE,代码如下:

<intent-filterlabel="Resize Image">

...

<categoryandroid:name="android.intent.category.ALTERNATIVE" />

<categoryandroid:name="android.intent.category.SELECTED_ALTERNATIVE"/>

...

</intent-filter>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值