Android学习笔记-Menu

Android学习笔记-Menu 
Menu分三种:
Option Menu:选择菜单,单击”menu”按键出现。
ContextMenu:上下文菜单,长按出现。
SubMenu:子菜单
一、创建Menu资源:除了在代码中实例化menu之外,还要在XML中定义所有menu和Item的资源。
Menu资源中包含如下属性:
<menu>
<item>
<group>
二、扩展menu resources:我们可以在代码中通过将xml资源转化为对象来扩展menu资源,如下:
@Override
publicbooleanonCreateOptionsMenu(Menu menu){
MenuInflaterinflater =getMenuInflater();
inflater.inflate(R.menu.game_menu,menu);
return true;
}
getMenuInflater()方法返回了一个MenuInflater对象,用此对象来调用inflate()方法,将menu资源填充到menu对象中。

三、创建Option Menu在Options Menu中的item可通过“MENU”按键或者actionBar(android3.0以上)访问。
当第一次创建option menu时会调用onCreateOptionsMenu()方法,在该方法中我们用xml资源文件来填充Menu,如上面的例子。
3.1响应用户动作当用户点击Item时会调用onOptionsItemSelected(),该方法将用户点击的MenuItem传递。我们可以用getItemId()来识别单击的Item。如下所示:
@Override
publicbooleanonOptionsItemSelected(MenuItemitem) {
   // Handle item selection
switch (item.getItemId()){
caseR.id.new_game:
newGame();
return true;
caseR.id.help:
showHelp();
return true;
default:
        returnsuper.onOptionsItemSelected(item);//将无法处理的操作交给父类来处理是推荐的操作
    }
}
*如果多个activity都拥有相同的menu,我们可以定义一个只实现onCreateOptionsMenu()and onOptionsItemSelected()的activity,然后让其他类来继承该类。如果想在子类中添加新的item,则只需重写onCreateOptionsMenu();并super.onCreateOptionsMenu(menu)使原来的Item也被创建,然后add()新的Item即可。
3.2运行时改变Menu ItemonCreateOptionsMenu()只有在menu刚被创建时才会执行,因此要想随时动态改变OptionMenu就要实现onPrepareOptionsMenu()方法,该方法会传给你Menu对象,供使用
Android2.3或更低的版本会在每次Menu打开的时候调用一次onPrepareOptionsMenu().
Android3.0及以上版本默认menu是打开的,所以必须调用invalidateOptionsMenu()方法,然后系统将调用onPrepareOptionsMenu()执行update操作。

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

四、创建ContextMenu

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

@Override
public void onCreateContextMenu(ContextMenumenu, View v,// 用户选择的 View
ContextMenuInfomenuInfo) {// 可附带额外的信息
super.onCreateContextMenu(menu, v,menuInfo);
MenuInflaterinflater = getMenuInflater();
inflater.inflate(R.menu.context_menu,menu);
}
当用户点击某个Item时将执行onContextItemSelected()方法:
@Override
publicbooleanonContextItemSelected(MenuItemitem) {
AdapterContextMenuInfo info =(AdapterContextMenuInfo) item.getMenuInfo();// 获得选择的 item 位置
switch (item.getItemId()) {
caseR.id.edit:
editNote(info.id);
return true;
caseR.id.delete:
deleteNote(info.id);
return true;
default:
returnsuper.onContextItemSelected(item);
  }
}
注意:ContextMenu中的Item不支持icons和热键(shotcut  keys)
五、创建submenus当创建menu sources时可通过在Item下添加<menu>来实现submenu,代码如下:
<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<item android: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>
当用户点击submenu的Item时,父menu的相应的itemselected方法将做相应。如上例optionMenu的onOptionsItemSelected()方法将会响应。
六、Menu的其他特征6.1MenuGroups

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

l  显示或者隐藏所有Items:setGroupVisible()
l  使Items同时可用或不可用:setGroupEnabled()
l  使Items同时选民:setGroupCheckable()
我们可以在XML文件中用group来包裹item实现groups,代码如下:
<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<item android: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可选择的Menu Items来自图标菜单的Items中不能显示单选或多选按钮。
我们可以为每一个Item用android:checkable来定义选择属性,也可以在group中用android:checkableBehavior来定义整体的选择属性。如下:
<?xml version="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item android:id="@+id/red"
android:title="@string/red" />
<item android:id="@+id/blue"
android:title="@string/blue"/>
</group>
</menu>
android:checkableBehavior属性可以接受如下三个值:
single likeradio buttons
all likecheckboxes

none
当某个可选的Item被选中时,系统会调用相应的Itemselected返回方法,此时我们必须手动设置当前item的选中状态,因为它本身并不会自动改变。例如:
@Override
publicbooleanonOptionsItemSelected(MenuItemitem) {
switch (item.getItemId()) {
caseR.id.vibrate:
caseR.id.dont_vibrate:
if (item.isChecked())item.setChecked(false);
elseitem.setChecked(true);
return true;
default:
returnsuper.onOptionsItemSelected(item);
  }
}
如果不做如上设置的话,用户选择后,选择结果将不会被保存。
注意:以上设置也只能保证在当前session中有效,如果想应用destroy销毁后仍然有效就要使用Shared Preferences.
6.3热键(shortcut keys)

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

6.4动态添加menu意图当menu item想通过Intent调用某一activity时,可能此activity并不存在,因此android允许用户动态为menu Item添加意图
添加可以根据activity是否可用来接受intent的Item:
l  定义包含category CATEGORY_ALTERNATIVE and/or CATEGORY_SELECTED_ALTERNATIVE的Intent。
l  调用 Menu.addIntentOptions(),android将自动搜索可执行intent的用的应用并添加到menu上
示例代码:
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
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.
   Intent intent = 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 beadded
        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 thatdescribes our requirements
        0,      // Additional flags tocontrol items (none)
null); // Array of MenuItems that correlate to specific items (none)

return true;
}
6.5允许自己的application被添加到别人的menu上

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

<intent-filter label="ResizeImage">
   ...
<categoryandroid:name="android.intent.category.ALTERNATIVE" />
<categoryandroid:name="android.intent.category.SELECTED_ALTERNATIVE" />
   ...
</intent-filter>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Python学习笔记》是由皮大庆编写的一本关于Python语言学习的教材。在这本书中,作者详细介绍了Python语言的基础知识、语法规则以及常用的编程技巧。 首先,作者简要介绍了Python语言的特点和优势。他提到,Python是一种易于学习和使用的编程语言,受到了广大程序员的喜爱。Python具有简洁、清晰的语法结构,使得代码可读性极高,同时也提供了丰富的库和模块,能够快速实现各种功能。 接着,作者详细讲解了Python的基本语法。他从变量、数据类型、运算符等基础知识开始,逐步介绍了条件语句、循环控制、函数、模块等高级概念。同时,作者通过大量的示例代码和实践案例,帮助读者加深对Python编程的理解和应用。 在书中,作者还特别强调了编写规范和良好的编程习惯。他从命名规范、注释风格、代码缩进等方面指导读者如何写出清晰、可读性强的Python代码。作者认为,良好的编程习惯对于提高代码质量和提高工作效率非常重要。 此外,作者还介绍了Python的常用库和模块。他提到了一些常用的库,如Numpy、Pandas、Matplotlib等。这些库在数据处理、科学计算、可视化等领域有广泛的应用,帮助读者更好地解决实际问题。 总的来说,《Python学习笔记》是一本非常实用和全面的Python学习教材。通过学习这本书,读者可以系统地学习和掌握Python编程的基础知识和高级应用技巧,为以后的编程学习和工作打下坚实的基础

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值