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 菜单的更多相关文章

  1. C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

    在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一 ...

  2. 11 PopupMenu菜单和代码例子

    PopupMenu 弹出式菜单 API 11以上可用 1. 获取弹出菜单的对象 2. 在res里的menu添加菜单项 3. 将布局里的菜单项 给弹出菜单 4. 进行监听弹出菜单 5. 展示出弹出菜单 ...

  3. 解决Android 4.0以上版本中OptionsMenu菜单不显示ICON图标的问题

    在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 Me ...

  4. EasyMvc入门教程-基本控件说明(11)菜单导航

    基本上,是个网站就会有菜单导航,目前流行的菜单是不是这样样子的? 似乎是bootstrap引领的风格,我们就用EasyMvc实现吧,上代码: @{ var data = new List<Men ...

  5. ABP开发框架前后端开发系列---(11)菜单的动态管理

    在前面随笔<ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理>中介绍了基于ABP框架服务构建的Winform客户端,客户端通过Web API调用的方式进行获取数据,从而实现 ...

  6. C#开发微信门户及应用(20)-微信企业号的菜单管理

    前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单 ...

  7. C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

    前面介绍了很多篇关于使用C#开发微信门户及应用的文章,基本上把当时微信能做的接口都封装差不多了,微信框架也积累了不少模块和用户,最近发现微信公众平台增加了不少内容,特别是在自定义菜单里面增加了扫一扫. ...

  8. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  9. C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

    微信公众号(包括服务号和订阅号)都可以对菜单进行自定义设置,我们为了方便管理,一般先把菜单数据在本地管理维护,需要更新的时候,把它们更新到微信服务器上就可以了.本文基于这个方式,介绍我的微信门户平台管 ...

随机推荐

  1. 网络硬盘NFS

    NFS是网络文件系统,用于计算机间共享文件系统,由sun公司1985年推出的协议,现在已经被广泛使用.一般来说,所有的linux发型版都支持NFS.nfs是一个服务器,客户端的架构,建立一个nfs的服 ...

  2. python中模块,包,库的概念

    模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...

  3. 谷歌开发者:看可口可乐公司是怎么玩转TensorFlow的?

    在这篇客座文章中,可口可乐公司的 Patrick Brandt 将向我们介绍他们如何使用 AI 和 TensorFlow 实现无缝式购买凭证. 可口可乐的核心忠诚度计划于 2006 年以 MyCoke ...

  4. 从JVM角度看i++ 与++i

    1.i++和++i的问题 反编译结果为 Code:  0:   iconst_1  1:   istore_1  2:   iinc    1, 1 //这个个指令,把局部变量1,也就是i,增加1,这 ...

  5. PHP开发中Redis安装(CentOS6.5)

    1.安装Redis 1 wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2 tar xzf redis-3.2.8.tar.gz 3 ...

  6. jquery easyui datagrid设置可编辑行的某个列不可编辑

    function onClickRowd(index1, field1) { if (editIndexd != index1) { if (endEditing()) { $('#dg').data ...

  7. 深入理解final关键字

    在了解了final关键字的基本用法之后,这一节我们来看一下final关键字容易混淆的地方. 1.类的final变量和普通变量有什么区别? 当用final作用于类的成员变量时,成员变量(注意是类的成员变 ...

  8. C# ref与out

    ref参数是引用,out参数为输出参数.我写一个控制台的程序来说明一下两者的特点和区别: class Program { 3 public static void RefMethod( ref int ...

  9. Vasya the Hipster

    One day Vasya the Hipster decided to count how many socks he had. It turned out that he had a red so ...

  10. Node.js 加密

    稳定性: 2 - 不稳定; 正在讨论未来版本的 API 改进,会尽量减少重大变化.详见后文. 使用 require('crypto') 来访问这个模块. 加密模块提供了 HTTP 或 HTTPS 连接 ...