Menu菜单的实现

大部分的应用程序都包括两种人机互动方式:

  一种是直接通过GUI的 Views,其可以满足大部分的交互操作。

  另外一种是应用Menu,当按下Menu按钮后,会弹出与当前活动状态下的应用程序相匹配的菜单。

这两种方式相比较都有各自的优势,而且可以很好的相辅相成,即便用户可以由主界面完成大部分操作,但是适当的拓展Menu功能可以更加完善应用程序,至少用户可以通过排列整齐的 按钮清晰的了解当前模式下可以使用的功能。
有两种方法可以为Android APPs添加菜单功能,下边将对设置过程给出详细的介绍:


第一种方法,通过Layout来添加静态菜单元素。
一般情况下,开发者在res/Layout路径下来定义应用程序的GUI。应用Android Studio创建一个新项目后,可以看到res/layout中存在一个 预置的main.xml文件,其作为程序默认启动界面。同样,可以通过这种方式 创建一个静态的Menu(Android Studio做了更多的预置 包括res/menu/main.xml),内容如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_settings"
        android:title="settings"
        android:orderInCategory="100"
        android:showAsAction="never" />
</menu>

在Activity类中调用刚刚创建的Menu,首先将当前的Activity与指定的Menu XML相关联(Android Studio中已在预先创建的Activiy中进行了此操作)

   @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.previous:
        previous(); //go to previous song in the playlist
        return true;
    case R.id.play_pause:
        isPlaying() ? pause() : play(); //toggle play/pause
        return true;
    case R.id.next:
        next(); //go to next song in the playlist
        return true;
    }
    return false; //should never happen
}

最后可以通过onPrepareOptionMenu方法初始化Menu Items的属性 (可选)
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    //set play_pause menu item look
    if(isPlaying()) {
        menu
            .findItem(R.id.play_pause)
            .setTitle(R.string.pause)
            .setIcon(android.R.drawable.ic_media_pause);
    } else {
        menu
            .findItem(R.id.play_pause)
            .setTitle(R.string.play)
            .setIcon(android.R.drawable.ic_media_play);
    }
    return true;
}
大部分程序都通过这种方式添加Menu菜单功能,而且通过以上的步骤来看,其实现方法非常简单。


第二种方法,在Activity类中动态创建Menu。
首先需要定义Menu Item识别序号:

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

实现onCreateOptionMenu()方法:(第一种方法中已经通过xml定义了现成的Menu结构,所以不需要应用这个方法)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu
        .add(0, MENU_PREVIOUS, 0, R.string.previous)
        .setIcon(android.R.drawable.ic_media_previous);
    menu
        .add(0, MENU_PLAY_PAUSE, 0, R.string.play)
        .setIcon (android.R.drawable.ic_media_play);
    menu
        .add(0, MENU_NEXT, 0, R.string.next)
        .setIcon(android.R.drawable.ic_media_next);
    return true;
}

引用与第一种方法相同的方式来捕捉菜单的行为:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case MENU_PREVIOUS:
        previous(); //go to previous song in the playlist
        return true;
    case MENU_PLAY_PAUSE:
        isPlaying() ? pause() : play(); //toggle play/pause
        return true;
    case MENU_NEXT:
        next(); //go to next song in the playlist
        return true;
    }
    return false; //should never happen
}

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

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

直接定义在XML Layout中:
?View Code 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>

转自:http://blog.dzwww.com/?937842/viewspace-385048

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值