Jan 3, 2011

Android菜单(Menu)的创建

Android 菜单(Menu)有两种。一种是ContextMenu(上下文菜单),长按某一个view两秒钟后弹出;另外一种是OptionMenu(全局菜单),按下Menu键弹出。这里讨论的是OptionMenu,ContextMenu也是一样的。


1.菜单的生成

1.1 编码方式
    对一个Android应用中的每一个屏幕,也就是说,对每一个Activity类,都会拥有一个默认菜单。在Activity类中,定义了几个与菜单有关的方法,供继承于Activity类的子类去重载,从而定制我们自己的菜单。这几个方法为:

    public boolean onCreateOptionsMenu(android.view.Menu menu);
    public boolean onPrepareOptionsMenu(android.view.Menu menu);
    public boolean onOptionsItemSelected(android.view.MenuItem item);

    为了生成我们自己的菜单,Android为我们提供了两个时机点。当在Activity类实例启动时,我们可以通过重载onCreateOptionsMenu()来定制我们的菜单;另外,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu来实现。对于第二种方式,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低。

    参考以下代码:

    private static final int    MENU_SETTING = Menu.FIRST;

    private static final int    MENU_ABOUT   = Menu.FIRST + 1;



    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        super.onCreateOptionsMenu(menu);


        // add(int groupId, int itemId, int order, CharSequence title);
        menu.add(0, MENU_SETTING, 0, "Setting");
        // add(int groupId, int itemId, int order, int titleRes);
        menu.add(0, MENU_ABOUT, 1, R.id.menu_about);


        return true;
    }

    关于menu.add(),请参考Android Developer Reference

1.2 xml读取Menu
    对于Android开发我们可以做的尽量MVC化,UI界面和Code逻辑代码分离方式,除了常规的Activity布局可以用xml实现外,菜单Menu也可以通过MenuInflater来映射一个布局文件,相关的创建菜单方法有些不同。

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {

        super.onCreateOptionsMenu(menu);

        // 载入menu
        this.getMenuInflater().inflate(R.menu.menu, menu);

        return true;
    }


    在res文件夹下创建一个menu文件夹,并创建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="@string/menu_setting"
        android:icon="@drawable/settign"></item>
    <item
        android:id="@+id/menu_about"
        android:title="@string/menu_about"
        android:icon="@drawable/about"></item>
</menu>

    menu.xml文件可以定制更多菜单项,并且可以设置菜单项是否可用、快捷方式、图标等。具体请参考Menu Resource | Android Developers

2. 菜单响应
    当菜单显示出来后,用户点击菜单中的某一菜单项,我们的菜单需要响应这个点击事件。这个也很简单,通过重载onOptionsItemSelected()方法来实现。

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {

        switch (item.getItemId())
        {
            case R.id.menu_about:
                //处理逻辑 
                return true;
            // 其他菜单项处理逻辑 ... 
            default:
                return super.onOptionsItemSelected(item);
        }
    }

No comments:

Post a Comment