你不知道的安卓菜单机制

总的来说 Android一共有3种形式的菜单:

        1.选项菜单(optionsMenu)

      2.上下文菜单(ContextMenu)

      3.子菜单(subMenu)

其中最常见的就是选项菜单(optionsMenu),该菜单在点击 menu按键后会在对应的Activity底部显示出来。

Activity菜单机制(与dialog类似)

1.public boolean onCreateOptionsMenu(Menu menu)

        用于初始化菜单,其中menu参数就好似即将要显示的Menu对象。

          返回true则显示该menu,false则不显示

        (只会在第一次初始化菜单时调用)

2.public boolean onPrepareOptionsMenu(Menu menu)

        在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。

    同样,返回true则显示该menu,false则不显示;

    (可以通过此方法活动的改变菜单的状态,比如加载不通的菜单等等)

3.public void onOptionsMenuClosed(Menu menu)

        每次菜单被关闭时调用。

    (菜单被关闭有3中情形,menu按钮被再次点击,back按钮被电击或者用户选择了某一个菜单项)

4.public boolean onOptionsItemSelected(MenuItem item)

    菜单项被点击时调用,也就是菜单项的监听方法。


   通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu对象。


2.添加菜单

    可以在onCreateOptionsMenu或者onPrepareOptionMenu方法中来添加菜单

    2.1代码添加

    menu.add((int groupId,int itemId,int order,

 title).setIcon(drawable ID)

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

        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对象

示例

@Overrride

    public boolean onCreateOptionsMenu(Menu menu){

        super.onCreateOptionsMenu(menu);

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

        return true;

}

布局文件,res目录下建一个menu文件夹, 并创建布局wenjian: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>


菜单项监听:只要菜单中的额菜单项被点击,都会触发onOptionsItemSelected(MenuItem item)

item参数即为被点击的菜单项,哪个需要在此方法内判断哪个Item被点击来,从而实现不同的操作

对于两种不同的添加菜单方法,判断的方法有一点区别,但本质一样


代码 添加的判定方法

@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:   //对应的ID就是在add()方法中所设定的id

                break;

            }

        retuen true;

}


布局文件添加菜单的判定方法

@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;

]

你可能感兴趣的:(你不知道的安卓菜单机制)