当前位置: 代码迷 >> Android >> Android的onCreateOptionsMenu()创办菜单Menu详解
  详细解决方案

Android的onCreateOptionsMenu()创办菜单Menu详解

热度:33   发布时间:2016-05-01 10:06:54.0
Android的onCreateOptionsMenu()创建菜单Menu详解

android一共有三种形式的菜单:
??????????? 1.选项菜单(optinosMenu)
??????????? 2.上下文菜单(ContextMenu)
??????????? 3.子菜单(subMenu)
其中最常用的就是选项菜单(optionsMenu), 该菜单在点击 menu 按键 后会在对应的Activity底部显示出来。

1.Activity菜单机制?(与dialog类似)
Activity有一套机制来实现对菜单的管理,方法如下:

public class MainActivity extends Activity {	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);	}	@Override	public boolean onCreateOptionsMenu(Menu menu) {		/**		 * 此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。 返回true则显示该menu,false 则不显示;		 * (只会在第一次初始化菜单时调用) Inflate the menu; this adds items to the action bar		 * if it is present.		 */		getMenuInflater().inflate(R.menu.main, menu);		return true;	}	@Override	public boolean onPrepareOptionsMenu(Menu menu) {		/**		 * 在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。 同样的,		 * 返回true则显示该menu,false 则不显示; (可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等) TODO		 * Auto-generated method stub		 */		return super.onPrepareOptionsMenu(menu);	}	@Override	public void onOptionsMenuClosed(Menu menu) {		/**		 * 每次菜单被关闭时调用. (菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项) TODO		 * Auto-generated method stub		 */		super.onOptionsMenuClosed(menu);	}	@Override	public boolean onOptionsItemSelected(MenuItem item) {		/**		 * 菜单项被点击时调用,也就是菜单项的监听方法。 		 * 通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。 TODO Auto-generated		 * method stub		 */		return super.onOptionsItemSelected(item);	}}

?

2. 添加菜单:
??????可以在onCreateOptionsMenu或者onPrepareOptionsMenu方法中来添加菜单

????? 2.1代码添加:
??????? menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)

?????? add()方法的四个参数,依次是:?

????? 1、组别,如果不分组的话就写Menu.NONE,?

????? 2、Id,这个很重要,Android根据这个Id来确定不同的菜单?

????? 3、顺序,哪个菜单项在前面由这个参数的大小决定?

????? 4、文本,菜单项的显示文本

?????? add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon

???? 示例:
??? public boolean onCreateOptionsMenu(Menu menu) {
??? ??? super.onCreateOptionsMenu(menu);
??? ??? menu.add(Menu.NONE,?Menu.First+1, 0, "设置").setIcon(R.drawable.setting);
??? ??? return true;
??? }
??????
????? 2.2布局文件添加:
?????????
?????? getMenuInflater().inflate(R.menu.options_menu, menu);

????? 调用Activity的getMenuInflater()得到一个MenuInflater,?
?????? 使用inflate方法来把布局文件中的定义的菜单 加载给 第二个参数所对应的menu对象

?????? 示例:
???? @Override
??? public boolean onCreateOptionsMenu(Menu menu) {
??? ??? super.onCreateOptionsMenu(menu);
??? ??? getMenuInflater().inflate(R.menu.options_menu, menu);
??? ??? return true;
??? }

??? 布局文件:
????? 在res目录下建立一个menu文件夹,并创建布局文件: options_menu.xml?
??? <?xml version="1.0" encoding="utf-8"?>
??? <menu xmlns:android="http://schemas.android.com/apk/res/android">
??? <item android:id="@+id/menu_setting" android:title="设置" android:icon="@drawable/setting"></item>
??? </menu>


?? 3.菜单项监听:
??? 只要菜单中的菜单项被点击,都会触发onOptionsItemSelected(MenuItem item)
??? item参数即为被点击的菜单项,那么需要在此方法内判断哪个Item被点击了,从而实现不同的操作。
??? 对于两种不同的添加菜单方法,判断的方法有一点区别,但本质是一样的。

??? 3.1代码添加菜单的判断方法
???? @Override
??? public boolean onOptionsItemSelected(MenuItem item) {
??? ??? super.onOptionsItemSelected(item);
??? ??? switch(item.getItemId())//得到被点击的item的itemId
??? ??? {
??? ??? case?Menu.First+1:?//对应的ID就是在add方法中所设定的Id
??? ??? ??? break;
??? ??? case?Menu.First+2:
??? ??? ??? break;
??? ??? }
??? ??? return true;
??? }

? 3.2布局文件添加菜单的判断方法:
??? @Override
??? public boolean onOptionsItemSelected(MenuItem item) {
??? ??? super.onOptionsItemSelected(item);
??? ??? switch(item.getItemId())//得到被点击的item的itemId
??? ??? {
??? ??? case?R.id.menu_setting://这里的Id就是布局文件中定义的Id,在用R.id.XXX的方法获取出来
??? ??? ??? break;
??? ??? case R.id.menu_info:
??? ??? ??? break;
??? ??? }
??? ??? return true;
??? }

?

  相关解决方案