android中创建菜单的常用方式

 

android 中实现菜单功能有多种方法。
Options Menu 用户按下 menu Button 时显示的菜单。
Context Menu 用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单。
Submenu 子菜单。

但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单。接下来我说的这种就是通过TabHostRadioGroup结合完成的菜单。这也是很常用的一种底部菜单做法。先上图

 

大部分的应用程序都包括两种人机互动方式,一种是直接通过GUI的 Views,其可以满足大部分的交互操作。另外一种是应用Menu,当按下Menu按钮后,会弹出与当前活动状态下的应用程序相匹配的菜单。

这两种方式相比较都有各自的优势,而且可以很好的相辅相成,即便用户可以由主界面完成大部分操作,但是适当的拓展Menu功能可以更加完善应用程序,至少用户可以通过排列整齐的 按钮清晰的了解当前模式下可以使用的功能。
有两种方法可以为Android APPs添加菜单功能,下边将对设置过程给出详细的介绍:
第一种方法,通过Layout来添加静态菜单元素。
一般情况下,开发者在res/Layout路径下来定义应用程序的GUI。应用Eclipse创建一个新项目后,可以看到res/layout中存在一个 预置的main.xml文件,其作为程序默认启动界面。同样,可以通过这种方式 创建一个静态的Menu,创建方法参阅下边的源代码:
?View Code XML

<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item   
        android:id="@+id/previous"   
        android:title="@string/previous"   
        android:enabled="false"  
        android:icon="@android:drawable/ic_media_previous"/>  
        <!--these may not be available in next api (level > 3), so be carefull-->  
    <item   
        android:id="@+id/play_pause"   
        android:title="@string/play"   
        android:icon="@android:drawable/ic_media_play"/>  
    <item   
        android:id="@+id/next"   
        android:title="@string/next"   
        android:icon="@android:drawable/ic_menu_next"/>  
</menu>

在Activity类中调用刚刚创建的Menu,首先将当前的Activity与指定的Menu XML相关联:
1.@Override
2.public boolean on CreateOptionsMenu(Menu menu) {
3.    super.on CreateOptionsMenu(menu);
4.    getMenuInflater().inflate(R.layout.player_menu, menu);
5.    return true;
6.}


实现on OptionsItemSelected方法: (其目的是捕捉到菜单触发事件后,对具体触发的选项作出响应,实际调用的函数包含在各自的case中)
01.@Override
02.public boolean on OptionsItemSelected(MenuItem item) {
03.    switch (item.getItemId()) {
04.    case R.id.previous:
05.        previous(); //go to previous song in the playlist
06.        return true;
07.    case R.id.play_pause:
08.        isPlaying() ? pause() : play(); //toggle play/pause
09.        return true;
10.    case R.id.next:
11.        next(); //go to next song in the playlist
12.        return true;
13.    }
14.    return false; //should never happen
15.}


最后可以通过on PrepareOptionMenu方法初始化Menu Items的属性:
01.@Override
02.public boolean on PrepareOptionsMenu(Menu menu) {
03.    //set play_pause menu item look
04.    if(isPlaying()) {
05.        menu
06.            .findItem(R.id.play_pause)
07.            .setTitle(R.string.pause)
08.            .setIcon(android.R.drawable.ic_media_pause);
09.    } else {
10.        menu
11.            .findItem(R.id.play_pause)
12.            .setTitle(R.string.play)
13.            .setIcon(android.R.drawable.ic_media_play);
14.    }
15.    return true;
16.}


大部分程序都通过这种方式添加Menu菜单功能,而且通过以上的步骤来看,其实现方法非常简单。
第二种方法,在Activity类中动态创建Menu。
首先需要定义Menu Item识别序号:
1.public static final MENU_PREVIOUS = 0; //no more R.ids
2.public static final MENU_PLAY_PAUSE = 1;
3.public static final MENU_NEXT = 2;


实现on CreateOptionMenu()方法:(第一种方法中已经通过xml定义了现成的Menu结构,所以不需要应用这个方法)
01.@Override
02.public boolean on CreateOptionsMenu(Menu menu) {
03.    menu
04.        .add(0, MENU_PREVIOUS, 0, R.string.previous)
05.        .setIcon(android.R.drawable.ic_media_previous);
06.    menu
07.        .add(0, MENU_PLAY_PAUSE, 0, R.string.play)
08.        .setIcon (android.R.drawable.ic_media_play);
09.    menu
10.        .add(0, MENU_NEXT, 0, R.string.next)
11.        .setIcon(android.R.drawable.ic_media_next);
12.    return true;
13.}


引用与第一种方法相同的方式来捕捉菜单的行为:
01.@Override
02.public boolean on OptionsItemSelected(MenuItem item) {
03.    switch (item.getItemId()) {
04.    case MENU_PREVIOUS:
05.        previous(); //go to previous song in the playlist
06.        return true;
07.    case MENU_PLAY_PAUSE:
08.        isPlaying() ? pause() : play(); //toggle play/pause
09.        return true;
10.    case MENU_NEXT:
11.        next(); //go to next song in the playlist
12.        return true;
13.    }
14.    return false; //should never happen
15.}


————
对以上两种方法的补充:
根据需要设置不同Menu Item的属性:
1.menu.findItem(R.id.next).setEnabled(false);


设置Menu Item从属关系(添加子父级别):
直接写在方法中:
1.menu
2.        .addSubMenu(R.id.repeat)
3.        .add(R.id. one)
4.        .add(R.id.all)
5.        .add(R.id.none);


直接定义在XML Layout中:
?View Co de XML
<item android:id="@+id/repeat" android:title="@string/repeat">  
<menu>  
    <item android:id="@+id/one" android:title="@string/repeat_one"></item>  
    <item android:id="@+id/all" android:title="@string/repeat_all"></item>  
    <item android:id="@+id/none" android:title="@string/repeat_none"></item>  
</menu>

你可能感兴趣的:(android中创建菜单的常用方式)