Menu与ActionBar的爱恨情仇
最近在开发一款音乐播放器,在开发过程中遇到了一点小麻烦,通过android API搞清楚了Menu与ActionBar的爱恨情仇,写了个小Demo祭奠一下那些年我们陷进去的坑,有不对的地方请大神们批评指正。
一.Android系统里的菜单接口(即Menu接口),它是一个父接口,其下又有两个子接口:SubMenu(子菜单)与ContextMenu(上下文菜单)
常用的菜单有以下三类:Option Menu(选项菜单,常与ActionBar连用),Context Menue(上下文菜单),Popup Menu(弹出框菜单),下面就以小Demo的形式介绍它们的使用方法。
1.Option Menu(选项菜单,常与ActionBar连用)
(1)使用Menu的add()方法,代码生成菜单项
/**
* 选项菜单
*/ public class OptionMenuActivity extends ActionBarActivity {
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_menu);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
//添加菜单项(组ID,当前选项ID,排序,标题)
menu.add(0,100,1,"设置游戏");
menu.add(0,200,2,"开始游戏");
menu.add(0,300,3,"退出游戏");
return super.onCreateOptionsMenu(menu);
} //菜单选项的单击事件处理方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case 100:
Toast.makeText(this,"正在打开设置游戏界面. ..",Toast.LENGTH_LONG).show();
break;
case 200:
Toast.makeText(this,"正在打开开始游戏界面...",Toast.LENGTH_LONG).show();
break;
case 300:
Toast.makeText(this,"正在打开退出游戏界面...",Toast.LENGTH_LONG).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
效果图如下:
(2)xml文件设置
public class OptionMenuActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_menu);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
//引进菜单布局
getMenuInflater().inflate(R.menu.memu_option,menu);
return super.onCreateOptionsMenu(menu);
} //菜单选项的单击事件处理方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case R.id.game_set:
Toast.makeText(this,"正在打开设置游戏界面. ..",Toast.LENGTH_LONG).show();
break;
case R.id.game_start:
Toast.makeText(this,"正在打开开始游戏界面...",Toast.LENGTH_LONG).show();
break;
case R.id.game_exit:
Toast.makeText(this,"正在打开退出游戏界面...",Toast.LENGTH_LONG).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".OptionMenuActivity"> <item android:id="@+id/game_set"
android:title="设置游戏"
android:orderInCategory="0"
app:showAsAction="never" />
<item android:id="@+id/game_start"
android:title="开始游戏"
android:orderInCategory="1"
app:showAsAction="never" />
<item
android:id="@+id/game_exit"
android:title="退出游戏"
android:orderInCategory="2"
app:showAsAction="never" />
</menu>
效果图如下:
注意事项:showAsAction与orderInCategory的作用
showAsAction主要是针对菜单的显示起作用的,它有三个可选项
always:总是显示在界面上
never:不显示在界面上,只让出现在右边的三个点中
ifRoom:如果有位置才显示,不然就出现在右边的三个点中
orderInCategory="100"(优先级,值越大优先级越低)
showAsAction="always"时的效果:(都未被放到了菜单项中,而是显示到ActionBar上了)
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".OptionMenuActivity"> <item android:id="@+id/game_start"
android:title="开始游戏"
android:orderInCategory="1"
app:showAsAction="always" />
<item android:id="@+id/game_set"
android:title="设置游戏"
android:orderInCategory="0"
app:showAsAction="always" />
<item
android:id="@+id/game_exit"
android:title="退出游戏"
android:orderInCategory="2"
app:showAsAction="always" />
</menu>
showAsAction="ifRoom"时的效果:(退出游戏显示不开被放到了菜单项中)
showAsAction="never"时的效果:(都被放到了菜单项中)
当未设置orderInCategory属性时,菜单列表上的每一项按从上往下的顺序排列:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".OptionMenuActivity"> <item android:id="@+id/game_start"
android:title="开始游戏"
app:showAsAction="never" />
<item android:id="@+id/game_set"
android:title="设置游戏"
app:showAsAction="never" />
<item
android:id="@+id/game_exit"
android:title="退出游戏"
app:showAsAction="never" />
</menu>
当设置orderInCategory属性时,菜单列表上的每一项按优先级排列(优先级从0开始,值越小优先级越高):
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".OptionMenuActivity"> <item android:id="@+id/game_start"
android:title="开始游戏"
android:orderInCategory="1"
app:showAsAction="never" />
<item android:id="@+id/game_set"
android:title="设置游戏"
android:orderInCategory="0"
app:showAsAction="never" />
<item
android:id="@+id/game_exit"
android:title="退出游戏"
android:orderInCategory="2"
app:showAsAction="never" />
</menu>
效果图如下:
2.Context Menu(上下文菜单)
(1)简介
(2)代码实现---ContextMenuActivity.class---menu_context.xml
public class ContextMenuActivity extends AppCompatActivity { private TextView changeColor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_context_menu); changeColor = (TextView) findViewById(R.id.tv_change_color);
//为TextView注册上下文菜单
registerForContextMenu(changeColor);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//引入上下文菜单布局
getMenuInflater().inflate(R.menu.memu_context,menu);
} @Override
public boolean onContextItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id){
case R.id.red:
changeColor.setBackgroundColor(Color.RED);
break;
case R.id.blue:
changeColor.setBackgroundColor(Color.BLUE);
break;
case R.id.green:
changeColor.setBackgroundColor(Color.GREEN);
break;
default:
break;
}
return super.onContextItemSelected(item);
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".menu.ContextMenuActivity"> <item android:id="@+id/blue"
android:title="蓝色"
android:orderInCategory="1" /> <item android:id="@+id/red"
android:title="红色"
android:orderInCategory="0" />
<item
android:id="@+id/green"
android:title="绿色"
android:orderInCategory="2" />
</menu>
(3)效果图:
3.Popup Menu(弹出式菜单)
(1)简介
(2)代码实现---PopupMenuActivity.class---menu_popup.xml
public class PopupMenuActivity extends AppCompatActivity { private Button btnClick;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_popup); btnClick = (Button) findViewById(R.id.bt_click); } //按钮的点击事件
public void typeSize(View v){
//弹出式按钮
PopupMenu popupMenu =new PopupMenu(this,v);
MenuInflater inflater = popupMenu.getMenuInflater();
inflater.inflate(R.menu.memu_popup,popupMenu.getMenu()); //设置监听事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ @Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.s:
Toast.makeText(PopupMenuActivity.this, "你选择了S号", Toast.LENGTH_LONG).show();
break;
case R.id.m:
Toast.makeText(PopupMenuActivity.this, "你选择了号", Toast.LENGTH_LONG).show();
break;
case R.id.l:
Toast.makeText(PopupMenuActivity.this, "你选择了S号", Toast.LENGTH_LONG).show();
break;
default:
break;
}
return false;
}
}); popupMenu.show();
} }
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_context_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.langdon.taiyang.androidtest.menu.PopupMenuActivity"> <Button
android:id="@+id/bt_click"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点我呀"
android:onClick="typeSize"/> </RelativeLayout>
(3)效果
Menu与ActionBar的爱恨情仇的更多相关文章
- web移动端fixed布局和input等表单的爱恨情仇 - 终极BUG,完美解决
[问题]移动端开发,ios下当fixed属性和输入框input(这里不限于input,只要可以调用移动端输入法的都包括,如:textarea.HTML5中contenteditable等),同时存在的 ...
- 注解:大话AOP与Android的爱恨情仇
转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...
- 除了love和hate,还能怎么表达那些年的“爱恨情仇”?
实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...
- 对json的爱恨情仇
本文回想了对json的爱恨情仇. C++有风险,使用需慎重. 本文相关代码在:http://download.csdn.net/detail/baihacker/7862785 当中的測试数据不在里面 ...
- String、StringBuilder、StringBuffer的爱恨情仇
第三阶段 JAVA常见对象的学习 StringBuffer和StringBuilder类 (一) StringBuffer类的概述 (1) 基本概述 下文以StringBuffer为例 前面我们用字符 ...
- [转帖]探秘华为(一):华为和H3C(华三)的爱恨情仇史!
探秘华为(一):华为和H3C(华三)的爱恨情仇史! https://baijiahao.baidu.com/s?id=1620703498823290828&wfr=spider&fo ...
- Tidyverse|数据列的分分合合,爱恨情仇
Tidyverse|数据列的分分合合,爱恨情仇 本文首发于“生信补给站”Tidyverse|数据列的分分合合,一分多,多合一 TCGA数据挖掘可做很多分析,前期数据“清洗”费时费力但很需要. 比如基因 ...
- pytorch和tensorflow的爱恨情仇之基本数据类型
自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...
- pytorch和tensorflow的爱恨情仇之定义可训练的参数
pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量 pytorch版本:1.6.0 tensorflow版本:1.15.0 之前我们就已 ...
随机推荐
- [LeetCode] Swap Nodes in Pairs 成对交换节点
Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...
- javascript正则表达式(RegExp)简述
首先我们来思考以下两个个场景 我们使用window操作系统,有时候需要找一个文件,刚刚好这个文件我不知道放哪里去了,这个时候我们该怎么办呢? 我们使用word写论文的时候,不小心将"订价&q ...
- c++局域网多播
转自http://www.51cto.com/specbook/17/35216.htm Visual C++实现局域网IP多播 在局域网中,管理员常常需要将某条信息发送给一组用户.如果使用一对一的发 ...
- 配置generatorConfig.xml自动生成的代码的sql书写问题
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- 关于pc端直播
写这篇文章首先是想给自己一个总结.整理,还有就是给那些 没有特别明白直播是怎么回事的人一点 思路 最近公司想要做pc端直播,作为一个自认为很菜的前端实在是不知从何下手,所以只能用国人最爱的百度,搜索了 ...
- 关于C++默认初始化的总结——开个坑
关于C++初始化总结的博客,其实以前在我的独立博客上写过相关的内容,可惜呀,没有续费,腾讯回收了我的空间, 到现在,关于C++初始化的内容,一直是我的心头病,现在准备开个坑,慢慢的总结进来吧. 1.关 ...
- 如何运行Spark程序
[hxsyl@CentOSMaster spark-2.0.2-bin-hadoop2.6]# ./bin/spark-submit --class org.apache.spark.examples ...
- 个人理解c#对称加密 非对称加密 散列算法的应用场景
c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...
- UVa11427 Expect the Expected
数学期望 概率递推 每一天的概率都是独立且相同的.可以先推出每天打i盘赢j盘的概率f[i][j] f[i][j]=f[i-1][j]*(1-p) + f[i-1][j-1]*p 输 赢 设此人打一天胜 ...
- strrchr 一个获取扩展名的方便的php函数
上传文件时,$_FILES里面的name是稳健的名称,要获取扩展名就用 strrchr(str,符号)来截取最后一个.后面的扩展名 然后用 trim 去掉特殊字符. 就可以得到扩展名了