zoukankan      html  css  js  c++  java
  • android menu的两种实现方法

    大部分的应用程序都包括两种人机互动方式,一种是直接通过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 onCreateOptionsMenu(Menu menu) {
    3.    super.onCreateOptionsMenu(menu);
    4.    getMenuInflater().inflate(R.layout.player_menu, menu);
    5.    return true;
    6.}


    实现onOptionsItemSelected方法: (其目的是捕捉到菜单触发事件后,对具体触发的选项作出响应,实际调用的函数包含在各自的case中)
    01.@Override
    02.public 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
    02.public 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识别序号:
    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;


    实现onCreateOptionMenu()方法:(第一种方法中已经通过xml定义了现成的Menu结构,所以不需要应用这个方法)
    01.@Override
    02.public 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
    02.public 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的属性:
    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 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>
  • 相关阅读:
    13.字符串压缩算法
    12.字符串全部替换指定文本
    46.数字到字符串的转换
    45.切割字符串并精确分配内存
    44.字符串删除指定字符或者字符串
    11.表达式计算对一串加减乘除带括号进行计算
    43.可变参数实现printf
    关于float与double区别
    float,double与long long哪个更大?
    double 与0比较时有个精度问题,有时需精确到小数点后面几位,例如与>0.0001,而不能与>0比较
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/dfgfd54354.html
Copyright © 2011-2022 走看看