您的位置:首页 > 移动开发 > Android开发

Android菜单选项

2016-09-17 14:20 429 查看
1、OptionsMenu 选项菜单

通过点击菜单键触发,每一个Activity都可以设置一个OptionsMenu。

通过onCreateOptionsMenu创建,该方法只在第一次触发菜单键时调用。(如果该页面返回,再次进入,点击菜单,还是会创建)

菜单项的创建有两种方式:

//第一种设置菜单的方式:通过R.menu创建

getMenuInflater().inflate(R.menu.main, menu);

//第二种设置菜单的方式:通过menu直接添加

//参数的含义: 参数一 组别 如果不分组就用 Menu.NONE

//参数二:id :Android根据ID来确定不同的菜单

//参数三:顺序 菜单的显示顺序

//参数四: 菜单项的显示文本

menu.add(Menu.NONE, ITEM_ID, 3, "设置字体样式");

onCreateOptionsMenu中返回值如果为true,这个Menu为Visiable,如果为flase,Menu为InVisiable。

响应菜单的形式有两种:onOptionsItemSelected和onMenuItemSelected。

如何产生一种随机色:

int red=(int)(Math.random()*256);

int green=(int)(Math.random()*256);

int blue=(int)(Math.random()*256);

生成一种亮色:

Random random =new Random();

int r = 30 + random.nextInt(200);

int g = 30 + random.nextInt(200);

int b = 30 + random.nextInt(200);

tv.setTextColor(Color.rgb(red, green, blue));

MENU的初始化流程

菜单初始化:onCreateOptionsMenu(Menu menu)

菜单被选中:onOptionsItemSelected(MenuItem item)

菜单关闭: onOptionsMenuClosed(Menu menu)

选项菜单显示之前:onPrepareOptionsMenu(Menu menu)

打开菜单后的动作: onMenuOpened(int featureId, Menu menu)

2、ContextMenu 上下文菜单

ContextMenu是android的上下文菜单,长摁某项View,就会显示出来,比如EditText可以通过长摁弹出拥有“复制”“剪切”等项的ContextMenu。

实现ContextMenu分三步:

a、将上下文菜单和某个控件绑定到一起

registerForContextMenu(en_text);

b、创建上下文菜单 onCreateContextMenu

c、处理上下文菜单的点击事件 onContextItemSelected

ps:ContextMenu里的菜单项中不能有图片,但是可以设置它的header为图片,如:setHeaderIcon方法

OptionsMenu和ContextMenu的区别:

1、ContextMenu必须通过registerForContextMenu进行注册,而OptionsMenu不需要

2、所属对象不同,ContextMenu属于某个VIew,而OptionsMenu属于某个Activity。

3、ContextMenu可以有头,通过setHeaderIcon,setHeaderTitle(),setHeaderView来设置,否则就没有

4、OptionsMenu只在第一次点击菜单按钮是创建,ContextMenu每次点击View都创建,创建之前必定绑定了某个View.

PS:ContextMenu菜单项不能设置图片,这个是错误的,解决方案见代码

3、PopupMenu 冒泡菜单

基于一个View的位置展示菜单的形式。

创建方式如下:

//第二个参数:当前弹出菜单的参考显示位置的UI控件,根据参考view,在该view上或下找到合适的显示位置

PopupMenu pMenu=new PopupMenu(this, v);

//加载菜单资源,并将菜单项增加到弹出菜单中

getMenuInflater().inflate(R.menu.main,pMenu.getMenu());

//显示弹出菜单

pMenu.show();

通过pMenu.setOnMenuItemClickListener来响应事件。onOptionsItemSelected不能正常响应该菜单

onMenuItemSelected 也不能正常响应该菜单

4、AlertDialog 提示弹出框

(1)用于提示信息 如:是否退出系统?是 OR 否

第一步:实例化AlertDialog.Builder对象

AlertDialog.Builder builder=new AlertDialog.Builder(this);

ps:AlertDialog的构造方法是protected,所以无法实例化,通过Builder完成操作。

用protected修饰构造器方法是为了限制一些访问的类,这样修饰的后果是只有在同一个包中的类或者是子类才能访问这个构造器,只是因为public 太不安全的原因,这样可以排除非本包或本类子类的访问。

Builder是AlertDialog的一个静态内部类。

第二步:通过Builder对象,设置对话框相关信息(标题,内容,按钮)

按钮有三个PositiveButton(积极的)、NegativeButton(消极的)、NeutralButton(中立的)

三个按钮 首先展示NegativeButton,接着展示NeutralButton,最后展示PositiveButton。

ps:setCancelable(false) //禁止点击对话框之外的区域 取消或关闭 也禁止了返回键

(2)AlertDialog除了有信息提示的作用外,还有展示列表的功能

setMultiChoiceItems设置多选复选列表

setSingleChoiceItems设置单选按钮列表

setItems 设置普通列表

还可以通过 setView 添加一个自定义布局,实现编辑信息的目的

5、如何实现点击两次返回,退出系统

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// TODO Auto-generated method stub

if(keyCode==KeyEvent.KEYCODE_BACK){

exit();

return false; //无此返回值,会 将页面销毁,不符合业务逻辑

}

return super.onKeyDown(keyCode, event);

}

private long beginTime=0;

public void exit(){

if(System.currentTimeMillis()-beginTime>2000){

Toast.makeText(this, "再点击一次退出系统",Toast.LENGTH_LONG).show();

beginTime=System.currentTimeMillis();

}else{

finish();

System.exit(0);

}

}

6、android 的activity中

onCreateOptionsMenu

onMenuItemSelected

onOptionsItemSelected

onCreateContextMenu

onContextItemSelected

五个方法的使用:

onCreateOptionsMenu :

此方法为创建菜单方法,这个菜单就是你在点击手机menu键时会看到的菜单。

onCreateContextMenu :

此方法为创建菜单方法,你还需要对此菜单进行注册Activity.registerForContextMenu(View view),这个菜单是在你长按前面注册的view时看到的菜单。

onMenuItemSelected :

当你选择上面两种菜单任意一种时都会触发这个事件。

onOptionsItemSelected :

这个方法只在onCreateOptionsMenu 创建的菜单被选中时才会被触发。

onContextItemSelected :

这个方法只在onCreateContextMenu 创建的菜单被选中时才会被触发。

7、ProgressDialog 和ProgressBar 的区别

ProgressDialog是动态显示出来 并且遮挡住Activity 此时不能进行交互

而ProgressBar是静态显示在布局中的 加载过程中 同时可以与Activity进行交互

ProgressDialog进度条对话框是在加载数据的时候,弹出的一个对话框,会将部分Activity遮住

ProgressBar进度条是在页面中嵌入的一个组件,不是弹出的层。

ProgressDialog是继承自AlertDialog所设计的互动对话窗口,在应用时,必须新建ProgressDialog对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台失去焦点,直到进程结束后,才会将控制权交给应用程序,如果在Activity当中不希望后台失焦,又希望提示User有某后台程序正处于忙碌阶段,此时就会使用ProgressBar了。ProgressBar 继承自View.

8、Android4.0中Menu中icon不显示的解决方案

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

public class MenuBuilder implements Menu {

...

private boolean mOptionalIconsVisible = false;

....

void setOptionalIconsVisible(boolean visible) {

mOptionalIconsVisible = visible;

}

boolean getOptionalIconsVisible() {

return mOptionalIconsVisible;

}

...

}

上面的代码中,mOptionalIconsVisible成员初始值默认为false,这就是为什么给菜单设置图标没有效果的原因;所以,只要我们在创建菜单时通过调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true就可以了;这时候问题来了,要想调用该方法,就需要创建MenuBuilder对象,但是,我们是无法在开发的应用程序中创建MenuBuilder这个对象的(MenuBuilder为系统内部的框架类);

这时候就需要考虑用反射了,在代码运行创建菜单的时候通过反射调用setOptionalIconsVisible方法设置mOptionalIconsVisible为true,然后在给菜单添加Icon,这样就可以在菜单中显示添加的图标了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: