11 OptionsMenu 菜单
OptionsMenu 选项菜单(系统菜单 )
- OptionsMenu:系统级别菜单
菜单的使用步骤:
1. res里的menu里添加布局 在布局里写菜单项
2. 在逻辑代码中使用OnCreateOptionMenu()方法 将布局展示到菜单
3. 监听菜单项 onOptionsItemSelected() 方法进行监听- 注意若设置图片不显示那么打破封装性修改源码
- 案例
- 代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:showAsAction="never"
android:title="我设置图片,但没有显示">
<menu>
<item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:showAsAction="never"
android:title="设置图片的子菜单1"/>
<item
android:orderInCategory="2"
android:showAsAction="never"
android:title="沒有设置图片的子菜单2"/>
</menu>
</item>
</menu>
效果图
解决办法如下
package com.fmy.menu1;
import java.lang.reflect.Method;
import com.fmy.menu1.R;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout, menu);
//设置开启图片有效
setIconEnable(menu,true);
return super.onCreateOptionsMenu(menu);
}
//enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
- XML中的一些属性
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.fmy.menu.MainActivity" >
<!--
android:orderInCategory 排序 数值越大排到越后面 不设置按添加顺序
android:icon设置图标
android:title设置标题
android:showAsAction设置展示方法
值:
always永远展示在顶部 超出部分不显示
"ifRoom"如果有顶部有空间 那么展示 不然缩略在...
never永远不展示 缩略在控件中
注意:在顶部显示的item 在按菜单键menu键时不显示
-->
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:icon="@drawable/ic_launcher"
android:title="a"/>
</menu>
案例1:
如果showAsAction设置为always 超出部分会怎么样
- 代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:orderInCategory="2"
android:showAsAction="always"
android:title="2"/>
<item
android:orderInCategory="1"
android:showAsAction="always"
android:title="1"/>
<item
android:orderInCategory="3"
android:showAsAction="always"
android:title="3"/>
<item
android:orderInCategory="4"
android:showAsAction="always"
android:title="4"/>
<item
android:orderInCategory="5"
android:showAsAction="always"
android:title="5"/>
<item
android:orderInCategory="6"
android:showAsAction="always"
android:title="6"/>
<item
android:orderInCategory="7"
android:showAsAction="always"
android:title="7"/>
</menu>
案例2
用代码注册按钮 和在xml中设置子菜单按钮
在xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:orderInCategory="2"
android:showAsAction="always"
android:title="2">
<menu>
<!--方式一:在item中嵌套一个menu 后直接再写一个item -->
<item
android:orderInCategory="2"
android:showAsAction="always"
android:title="我是item-menu-item"/>
<!--方式二:在item中嵌套一个menu在放置group 后直接再写一个item -->
<group>
<item
android:orderInCategory="2"
android:showAsAction="always"
android:title="我是item-menu-group-item"/>
</group>
</menu>
</item>
</menu>
- java代码:
package com.fmy.menu1;
import java.lang.reflect.Method;
import com.fmy.menu1.R;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout, menu);
/**
* groupId --->> group的id值 即:放入哪个分组中
* itemId --->> 为这个item设置一个id 以后在监听中可用到
* order --->> 顺序
* title --->> 标题
*/
SubMenu sub = menu.addSubMenu(menu.NONE, 1, menu.NONE, "2");
sub.setIcon(R.drawable.ic_launcher);
sub.addSubMenu(1, 2, menu.NONE, "呵呵");
sub.addSubMenu(1, 2, menu.NONE, "哈哈");
SubMenu addSubMenu = menu.addSubMenu("嘿嘿");
addSubMenu.addSubMenu("嘿嘿下的子菜单");
sub.addSubMenu(menu.NONE, 2, menu.NONE, "你好朋友");
return super.onCreateOptionsMenu(menu);
}
}
- 案例3
监听事件
- xml 代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:id="@+id/root"
android:showAsAction="never"
android:title="我设置图片,但没有显示">
<menu>
<item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:showAsAction="never"
android:id="@+id/boy1"
android:title="设置图片的子菜单1"/>
<item
android:id="@+id/boy2"
android:orderInCategory="2"
android:showAsAction="never"
android:title="沒有设置图片的子菜单2"/>
</menu>
</item>
</menu>
- java代码:
package com.fmy.menu1;
import java.lang.reflect.Method;
import com.fmy.menu1.R;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout, menu);
//设置开启图片有效
setIconEnable(menu,true);
return super.onCreateOptionsMenu(menu);
}
//enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable);
} catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.root:
Toast.makeText(this, "root", 0).show();
break;
case R.id.boy1:
Toast.makeText(this, "boy1", 0).show();
break;
case R.id.boy2:
Toast.makeText(this, "boy2", 0).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
11 OptionsMenu 菜单的更多相关文章
- C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍
在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一 ...
- 11 PopupMenu菜单和代码例子
PopupMenu 弹出式菜单 API 11以上可用 1. 获取弹出菜单的对象 2. 在res里的menu添加菜单项 3. 将布局里的菜单项 给弹出菜单 4. 进行监听弹出菜单 5. 展示出弹出菜单 ...
- 解决Android 4.0以上版本中OptionsMenu菜单不显示ICON图标的问题
在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 Me ...
- EasyMvc入门教程-基本控件说明(11)菜单导航
基本上,是个网站就会有菜单导航,目前流行的菜单是不是这样样子的? 似乎是bootstrap引领的风格,我们就用EasyMvc实现吧,上代码: @{ var data = new List<Men ...
- ABP开发框架前后端开发系列---(11)菜单的动态管理
在前面随笔<ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理>中介绍了基于ABP框架服务构建的Winform客户端,客户端通过Web API调用的方式进行获取数据,从而实现 ...
- C#开发微信门户及应用(20)-微信企业号的菜单管理
前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单 ...
- C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能
前面介绍了很多篇关于使用C#开发微信门户及应用的文章,基本上把当时微信能做的接口都封装差不多了,微信框架也积累了不少模块和用户,最近发现微信公众平台增加了不少内容,特别是在自定义菜单里面增加了扫一扫. ...
- C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...
- C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器
微信公众号(包括服务号和订阅号)都可以对菜单进行自定义设置,我们为了方便管理,一般先把菜单数据在本地管理维护,需要更新的时候,把它们更新到微信服务器上就可以了.本文基于这个方式,介绍我的微信门户平台管 ...
随机推荐
- 关于Miller-Rabbin的一点想法
在好久之后终于搞完了miller-rabbin素性测试,谈谈自己的理解 要判断的数设为 a, 主要思想就是运用费马小定理来搞,随机几个数x(x<=a-1),判断x^(a-1)=1(mod a)是 ...
- 服务器使用nginx做代理,通过HttpServletRequest获取请求用户真实IP地址
首先,在nginx配置中添加如下配置 server { listen ; server_name www.wenki.info; #要访问的域名 charset utf8; location / { ...
- 智能优化算法对TSP问题的求解研究
要求: TSP 算法(Traveling Salesman Problem)是指给定 n 个城市和各个城市之间的距离,要 求确定一条经过各个城市当且仅当一次的最短路径,它是一种典型的优化组合问题,其最 ...
- VS2017+xamain开发安卓(Addroid)应用
Visual Studio 2017下载地址: https://www.visualstudio.com/zh-hans/ 安卓模拟器官网下载: https://www.visualstudio.c ...
- c++中双冒号的作用
双冒号(::)用法 参考链接:https://segmentfault.com/a/1190000000345680 1.表示“域操作符”例:声明了一个类A,类A里声明了一个成员函数void f(), ...
- glusterfs 4.0.1 api 分析笔记1
一般来说,我们写个客户端程序大概的样子是这样的: /* glfs_example.c */ // gcc -o glfs_example glfs_example.c -L /usr/lib64/ - ...
- windows的常用快捷键(实用篇)
整理一下windows的常用快捷键,有些快捷键老不用都忘记了,这里整理一下方便自己以后忘记时翻阅. 一.Fn键的使用 1.F1帮助 2.F2重命名 3.F3打开搜索 4.F4打开地址栏常用地址 5.F ...
- python实现购物车
一. 功能: 1. 用户充值余额 判断余额输入格式是否正确,正确则转换成float型. 2. 显示商品列表 根据已有商品显示所有商品的序号.商品名称.和价格供用户选择 3. 用户选择商品 判断用户输入 ...
- PLSQL(1)
PLSQLl编程 plsql是Oracle在标准的sql语言上的扩展 特点:可以在数据库中定义变量,常量,还可以使用条件语句和判断语句以及异常等 P ...
- 读书笔记-《Maven实战》-2018/4/18
第五章:坐标和依赖 1.每个依赖中可以包含的元素有: groupId,artifactId,version: 这三个元素是Maven项目最重要的元素.Maven需要根据这三个坐标找到需要的依赖. ty ...