关于Menu的两种设置方法

来源:互联网 发布:wifi丢包率测试软件 编辑:程序博客网 时间:2024/04/30 00:40

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

这两种方式相比较都有各自的优势,而且可以很好的相辅相成,即便用户可以由主界面完成大部分操作,但是适当的拓展Menu功能可以更加完善应用程序,至少用户可以通过排列整齐的按钮清晰的了解当前模式下可以使用的功能。

有两种方法可以为Android APPs添加菜单功能,下边将对设置过程给出详细的介绍:

第一种方法,通过Layout来添加静态菜单元素。

一般情况下,开发者在res/Layout路径下来定义应用程序的GUI。应用Eclipse创建一个新项目后,可以看到res/layout中存在一个预置的main.xml文件,其作为程序默认启动界面。同样,可以通过这种方式创建一个静态的Menu,创建方法参阅下边的源代码:







在Activity类中调用刚刚创建的Menu,首先将当前的Activity与指定的Menu XML相关联:

1@Override
2public boolean onCreateOptionsMenu(Menu menu) {
3    super.onCreateOptionsMenu(menu);
4    getMenuInflater().inflate(R.layout.player_menu, menu);
5    return true;
6}

实现onOptionsItemSelected方法: (其目的是捕捉到菜单触发事件后,对具体触发的选项作出响应,实际调用的函数包含在各自的case中)

01@Override
02public boolean onOptionsItemSelected(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}

最后可以通过onPrepareOptionMenu方法初始化Menu Items的属性:

01@Override
02public boolean onPrepareOptionsMenu(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识别序号:

1public static final MENU_PREVIOUS = 0; //no more R.ids
2public static final MENU_PLAY_PAUSE = 1;
3public static final MENU_NEXT = 2;

实现onCreateOptionMenu()方法:(第一种方法中已经通过xml定义了现成的Menu结构,所以不需要应用这个方法)

01@Override
02public boolean onCreateOptionsMenu(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
02public boolean onOptionsItemSelected(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的属性:

1menu.findItem(R.id.next).setEnabled(false);

设置Menu Item从属关系(添加子父级别):
直接写在方法中:

1menu
2        .addSubMenu(R.id.repeat)
3        .add(R.id.one)
4        .add(R.id.all)
5        .add(R.id.none);

直接定义在XML Layout中:







————

这两种不同的方法实现的目的是一样的,而且不存在本质上的却别,具体根据实际情况(根据项目的结构需要或者团队开发标准)选择合适的方法来创建Menu。

查看原文 androidSnippets.org

原创粉丝点击