zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
    
  • 相关阅读:
    c++经典书籍介绍
    jpeg软解码实现介绍
    视频编解码类型调查——抖音客户端
    微机接口复习
    更改MySQL数据库的密码
    python学习之创建我的第一个Django项目
    关于 V831 linux 调用 gpio 的一些通用操作。
    SpringBoot整合H2内存数据库快速启动测试
    MybatisPlus的各种功能使用笔记综合!
    MybatisPlus的自动填充功能使用!
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152273.html
Copyright © 2011-2022 走看看