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)-微信门户菜单管理及提交到微信服务器
微信公众号(包括服务号和订阅号)都可以对菜单进行自定义设置,我们为了方便管理,一般先把菜单数据在本地管理维护,需要更新的时候,把它们更新到微信服务器上就可以了.本文基于这个方式,介绍我的微信门户平台管 ...
随机推荐
- Java实现word文档在线预览,读取office文件
想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览. 一.使用openof ...
- Feign报错Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client
问题描述 使用Feign调用微服务接口报错,如下: java.lang.RuntimeException: com.netflix.client.ClientException: Load balan ...
- c++读写MySQL
看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂.写这篇文章的目的不是别的,就一个,告诉您用 ...
- HTML的基本介绍
HTML(HyperText Markup Language): 超文本标记语言,超文本就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. HTML是标记语言!!!!! HTML是标记语言! ...
- dfsdf
This project was bootstrapped with Create React App. Below you will find some information on how to ...
- swift之属性
知识点总结: 1.存储属性 struct Town{ let region = "South" //只读属性 var population = //读写属性 } 2.惰性存储属性 ...
- WEB中间件--tomcat爆破,burp和python脚本
1.tomcat 用burpsuit进行弱口令爆破 先抓包 发送到inturder payload type 选择custom iterater 第一个payload选用户名文件,第二个payload ...
- 深入理解final关键字
在了解了final关键字的基本用法之后,这一节我们来看一下final关键字容易混淆的地方. 1.类的final变量和普通变量有什么区别? 当用final作用于类的成员变量时,成员变量(注意是类的成员变 ...
- Android studio安装和问题
一.Android studio的安装 [提示]A.以下Android studio2.2.2版本.(也有新版本) B.以下是用Android studio自带的sdk ①双击安装文件进行安装 ②如果 ...
- HTTP请求分析工具Fiddler
主要用于分析http头信息和响应头信息,以及具体的post数据和响应数据,可以监测电脑上http请求.