11 OptionsMenu 菜单

OptionsMenu 选项菜单(系统菜单 )

  • OptionsMenu:系统级别菜单
    菜单的使用步骤:
    1. res里的menu里添加布局 在布局里写菜单项
    2. 在逻辑代码中使用OnCreateOptionMenu()方法 将布局展示到菜单
    3. 监听菜单项 onOptionsItemSelected() 方法进行监听
  • 注意若设置图片不显示那么打破封装性修改源码
    • 案例
      • 代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:icon="@drawable/ic_launcher"
        android:orderInCategory="1"
        android:showAsAction="never"
        android:title="我设置图片,但没有显示">
        <menu>
            <item
                android:icon="@drawable/ic_launcher"
                android:orderInCategory="1"
                android:showAsAction="never"
                android:title="设置图片的子菜单1"/>
            <item
                android:orderInCategory="2"
                android:showAsAction="never"
                android:title="沒有设置图片的子菜单2"/>
        </menu>
    </item>

</menu>

效果图
设置图片但没有显示的根图
设置了效果图的子按钮

解决办法如下

package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.layout, menu);

        //设置开启图片有效
        setIconEnable(menu,true);

        return super.onCreateOptionsMenu(menu);
    }


    //enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效  
    private void setIconEnable(Menu menu, boolean enable)  
    {  
        try   
        {  
            Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");  
            Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);  
            m.setAccessible(true);  

            //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)  
            m.invoke(menu, enable);  

        } catch (Exception e)   
        {  
            e.printStackTrace();  
        }  
    }  

}

  • XML中的一些属性
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.fmy.menu.MainActivity" >



    <!-- 
        android:orderInCategory 排序 数值越大排到越后面 不设置按添加顺序
        android:icon设置图标
        android:title设置标题
        android:showAsAction设置展示方法
            值:
                always永远展示在顶部 超出部分不显示
                "ifRoom"如果有顶部有空间 那么展示 不然缩略在...
                never永远不展示 缩略在控件中
                注意:在顶部显示的item 在按菜单键menu键时不显示
     -->
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:icon="@drawable/ic_launcher"
        android:title="a"/>


</menu>

  • 案例1:

    如果showAsAction设置为always 超出部分会怎么样

    • 代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

     <item
        android:orderInCategory="2"
        android:showAsAction="always"

        android:title="2"/>
    <item
        android:orderInCategory="1"
        android:showAsAction="always"

        android:title="1"/>
    <item
        android:orderInCategory="3"
        android:showAsAction="always"

        android:title="3"/>
    <item
        android:orderInCategory="4"
        android:showAsAction="always"

        android:title="4"/>
    <item
        android:orderInCategory="5"
        android:showAsAction="always"

        android:title="5"/>
    <item
        android:orderInCategory="6"
        android:showAsAction="always"

        android:title="6"/>
    <item
        android:orderInCategory="7"
        android:showAsAction="always"

        android:title="7"/>

</menu>

案例一


  • 案例2

    用代码注册按钮 和在xml中设置子菜单按钮

  • 在xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:orderInCategory="2"
        android:showAsAction="always"
        android:title="2">
        <menu>
           <!--方式一:在item中嵌套一个menu 后直接再写一个item  -->
            <item
                android:orderInCategory="2"
                android:showAsAction="always"
                android:title="我是item-menu-item"/>

            <!--方式二:在item中嵌套一个menu在放置group 后直接再写一个item  -->
            <group>
                <item
                    android:orderInCategory="2"
                    android:showAsAction="always"
                    android:title="我是item-menu-group-item"/>
            </group>
        </menu>
    </item>

</menu>

案例二xml中的效果图

  • java代码:
package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.layout, menu);
        /**
         *  groupId --->> group的id值 即:放入哪个分组中
         *  itemId  --->> 为这个item设置一个id 以后在监听中可用到
         *  order   --->> 顺序
         *  title   --->> 标题
         */
        SubMenu sub = menu.addSubMenu(menu.NONE, 1, menu.NONE, "2");
        sub.setIcon(R.drawable.ic_launcher);
        sub.addSubMenu(1, 2,  menu.NONE, "呵呵");
        sub.addSubMenu(1, 2,  menu.NONE, "哈哈");
        SubMenu addSubMenu = menu.addSubMenu("嘿嘿");
        addSubMenu.addSubMenu("嘿嘿下的子菜单");
        sub.addSubMenu(menu.NONE, 2,  menu.NONE, "你好朋友");

        return super.onCreateOptionsMenu(menu);
    }




}

java代码生成的效果图1
java代码生成的效果图1



  • 案例3

监听事件

  • xml 代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:icon="@drawable/ic_launcher"
        android:orderInCategory="1"
        android:id="@+id/root"
        android:showAsAction="never"
        android:title="我设置图片,但没有显示">
        <menu>
            <item
                android:icon="@drawable/ic_launcher"
                android:orderInCategory="1"
                android:showAsAction="never"
                android:id="@+id/boy1"
                android:title="设置图片的子菜单1"/>
            <item
                android:id="@+id/boy2"
                android:orderInCategory="2"
                android:showAsAction="never"
                android:title="沒有设置图片的子菜单2"/>
        </menu>
    </item>

</menu>
  • java代码:
package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.layout, menu);

        //设置开启图片有效
        setIconEnable(menu,true);

        return super.onCreateOptionsMenu(menu);
    }


    //enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效  
    private void setIconEnable(Menu menu, boolean enable)  
    {  
        try   
        {  
            Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");  
            Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);  
            m.setAccessible(true);  

            //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)  
            m.invoke(menu, enable);  

        } catch (Exception e)   
        {  
            e.printStackTrace();  
        }  
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
        case R.id.root:
            Toast.makeText(this, "root", 0).show();
            break;
        case R.id.boy1:
            Toast.makeText(this, "boy1", 0).show();
            break;
        case R.id.boy2:
            Toast.makeText(this, "boy2", 0).show();
            break;

        default:
            break;
        }
        return super.onOptionsItemSelected(item);
    }

}
原文地址:https://www.cnblogs.com/muyuge/p/6152273.html