安卓开发中菜单是一个很重要的组件,从安卓开发文档(http://wear.techbrood.com/guide/index.html)中可以看到,安卓UI设计中的Menu主要分为:

A.Options menu and action bar

     

在3.0以下的系统中,Options menu 显示为左图的效果,接下来看看怎么在app中实现一个options menu。

静态 menu 可以从 xml 文件中直接加载,所以我们要先写一个 menu 列表

1.编写 xml 文件, 如 main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.testmenu.MainActivity" > <item
android:id="@+id/add"
android:title="add"/> <item
android:id="@+id/delete"
android:title="delete"/> <item
android:id="@+id/query"
android:title="query"/> <item
android:id="@+id/update"
android:title="update"/> </menu>

2.重写 onCreateOptionsMenu() 方法

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return true;
}

3.处理 menu 的交互(在例子中使用 Toast 弹出信息确定点击了哪个 item )

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
Toast.makeText(MainActivity.this, "You click " + item.getTitle(), Toast.LENGTH_SHORT).show();
}

以上就完成了一个 menu 的简单例子。

另:有些情况下,我们需要在程序运行时动态生成一个 menu ,这种情况下自然就不适合使用 xml 文件来加载 menu 了,官方开发文档告诉我们,

After the system calls onCreateOptionsMenu(), it retains an instance of the Menu you populate and will not call onCreateOptionsMenu() again unless the menu is invalidated for some reason. However, you should use onCreateOptionsMenu() only to create the initial menu state and not to make changes during the activity lifecycle.

也就是说正常情况下系统调用了 onCreateOptionsMenu() 方法以后不会再次调用该方法,这个方法只是用来初始化 menu 的,当你需要动态修改 menu 的情况下就不应该使用这个方法了。

Prepare the Screen's standard options menu to be displayed. This is called right before the menu is shown, every time it is shown. You can use this method to efficiently enable/disable items or otherwise dynamically modify the contents. See Activity.onPrepareOptionsMenu for more information.

很清楚, menu 每次被显示出来之前, onPrepareOptionsMenu() 都会被调用一次,所以如果我们要生成动态 menu 的话,处理 menu 的代码就应该写在这里。

例如:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add("hello");
return super.onPrepareOptionsMenu(menu);
}

在例子中我们重载了 onPrepareOptionsMenu() 函数,效果是每点击一次 menu ,都会在 menu 中添加一个 hello 的菜单项。

B.Context menu and contextual action mode

左边是Context menu

1.为 Context menu 注册 view 对象,也就是通过哪个对象来激活 menu

registerForContextMenu(textView);

2.实现 onCreateContextMenu() 方法

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.main, menu);
}

3.实现 onContextItemSelected(MenuItem item) 方法

@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "You click " + item.getTitle(), Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
}

4.实现 ActionMode.Callback 接口

private ActionMode.Callback mCallback = new ActionMode.Callback() {

        @Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
} @Override
public void onDestroyActionMode(ActionMode mode) {
// TODO Auto-generated method stub } @Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();;
return false;
}
};

5.通过监听器调用 startActionMode(mCallback) 方法,如:

TextView textView = (TextView) findViewById(R.id.hello);
textView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActionMode(mCallback);
}
});

C.Popup menu

Popup menu 与上面两种 menu 基本相同,可以参考http://wear.techbrood.com/guide/topics/ui/menus.html

安卓开发学习之Menu的更多相关文章

  1. 安卓开发学习笔记(三):Android Stuidio无法引用Intent来创建对象,出现cannot resolve xxx

    笔者在进行安卓开发时,发现自己的代码语法完全没有问题.尤其是创建intent对象的时候,语法完全是正确的,但是Android Stuidio却显示报错,Intent类显示为红色,如图所示: 代码如下所 ...

  2. 安卓开发学习之AutoCompleteTextView

    最近在学习安卓开发,开始是看视频学的,基本上是照着老师的操作来,但其实老师也是按照安卓的开发文档来教的,于是决定试试自己看文档来学. 今天学到AutoCompleteTextView,一上来先按照Li ...

  3. 安卓开发学习日记 DAY1

    1.eclipse安装,很简单 2.安卓sdk manager 下载安装 sdk manager是一个安卓开发所使用的sdk文件的管理程序,可以使用这个程序在官网上下载相应的安卓的api等.因为需要在 ...

  4. 安卓开发学习历程1——《第一行代码》coolweather项目setOnItemClickListener函数,Sql语句修改对模拟app程序机影响

    今天,将<第一行代码>最后实战的coolweather项目,认真做了一遍. 今晚,在书中第一阶段开发代码认眞在Android studio敲完,发现setOnItemClickListen ...

  5. 初学安卓开发随笔之 Menu、toast 用法、活动的四种启动模式 以及 一个方便的Base活动类使用方法

    Toast toast 是安卓系统的一种非常棒的提醒方式 首先定义一个弹出Toast的触发点,比如可以是按钮之类 其中 Toast.LENGTH_SHORT是指显示时长 还有一个内置变量为Toast. ...

  6. 安卓开发学习笔记(四):Android Stuidio无法实现隐式Intent是为什么?

    一.首先检查我们的代码: FirstActivity.java(主活动程序当中的代码):Button3监听器后面的代码就是我们隐式Intent的业务逻辑所在了,大家可以往下面看看,大概在代码的第57行 ...

  7. 安卓开发学习笔记(五):史上最简单且华丽地实现Android Stutio当中Webview控件https/http协议的方法

    一.我们先在XML当中自定义一个webview(Second_layout.xml) 代码如下: <?xml version="1.0" encoding="utf ...

  8. 安卓开发学习日记 DAY5——监听事件onClick的实现方法

    今天主要学习了监听事件的是实现方法,就是说,做了某些动作后,怎么监听这个动作并作出相应反应. 方法主要有三种: 1.匿名内部类的方法 2.独立类的方法 3.类似实现接口的方法 以下分别分析: 1.匿名 ...

  9. 安卓开发学习日记 DAY3——TextView,EditView,ImageView

    今天学习了一些控件的使用方法,包括TextView,EditView,ImageView 1.TextView,输出一个文本呗 主要属性有 android:id 标志 android:layout_w ...

随机推荐

  1. 小程序一个大盒子里面的盒子内容居中对其显示wxss写法

    对小程序研究感兴趣的可加(交流QQ群:604788754)入群联系群主可得到小程序教学资源. 这个案例只是想展示效果,内容部分未进行for循环绑定处理: WXML: <view class=&q ...

  2. pyCharm-激活码(2018)

    最近使用pycharm的时候,用的是很久以前的激活地址 于是网上到处寻找最新地址,然而 网上之前分享的激活地址已经多半过期, 于是找朋友帮忙,终于找到一个可用的了 1.选择 Activate new ...

  3. For in + 定时器

    Fon in for/in 语句用于循环对象属性. 循环中的代码每执行一次,就会对对数组的元素对象的属性进行一次操作. <p id = "demo"><p> ...

  4. python修炼第五天

    第五天,感觉开始烧脑了.递归逻辑难,模块数量多,但是绝世武功都是十年磨一剑出来的!稳住! 1 递归. 定义-----递归就是在函数的内部调用自己递归深度 998不建议修改递归深度,因为如果998都没有 ...

  5. Https 单向验证 双向验证

    通讯原理 participant Client participant Server Client->>Server: 以明文传输数据,主要有客户端支持的SSL版本等客户端支持的加密信息 ...

  6. JavaScript 进阶

    字符串方法 ① charAt() 方法可返回指定位置的字符 ② indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 ③ split() 方法将字符串分割为字符串数组,并返回此数组 ...

  7. oralce执行计划

    看懂Oracle执行计划   最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing… 一:什么是Oracle执行计划? 执行计划是一条查询语句在 ...

  8. java基础1(二)

    Bean的xml配置 1.bean的初始化方式 三种方式: 默认构造器,静态工厂初始化(了解)和实例工厂初始化(了解) 2.springbean的作用域 Bean默认作用域是单实例的 可以设置非单实例 ...

  9. TypeError: format string

    先来看一段Python代码: class Negate: def __init__(self, val): self.val = -val def __repr__(self): return str ...

  10. php 跨域请求

    执行要在跨域请求的服务器端对应的代码上增加下面的代码 <?php namespace Admin\Controller; // 指定允许跨域访问 header('Access-Control-A ...