Android菜单Menu详解

菜单资源文件通常放置在res\menu 目录下,在创建项目时,默认不自动创建menu目录,所以需手动创建。

Android Resource Directory→ value menu

或在创建根元素为**<menu></menu>**标记的xml文件对自动气建眼

res→Android Resounce File →Resource type→menu
子元素为**<item></iten><group></group>**

<item>liter>标记常用属性,描述:

andraid:id 设置ID,也就是唯一标识。

android:title 设置标题。

android: alphabeticShortcut 指定字符快捷键。

android: numericShortcut 指定数字快捷键。

android: enabled 是否可用。

android: checkable 是否可选。

android: visible 是否可见。

android: checked 是否已选用。

android: icon 指定图标,需重写onMenuOpened方法并在其中调用设置显示图标才会在列表项中显示图标(重写方法)。
app: showAsAction 该属性用于溢出菜单控制菜单项在导航栏上展示位置。值可为:

always 总是在导航栏上显示菜单图标。
ifRoom 如果导航栏右侧有空间,该项就直接显示在导航栏上,不再放入溢出菜单。
never 从不在导航栏上显示,一直放在溢出菜单列表中。
withText 如果能在导航栏上显示,除了显示图标还要显示该项的文字说明。
collapseActionView 操作视图要折叠为一个按钮,点击该按钮再展示操作视图主要用于Searchview。

<group></group>标记常用属性,描述:

android: id 为菜单组设置ID。

android: checkableBehavior 指定菜单组选择行为,值可为none(不可选)、all(多选)、single(单选)。

android: menuCategory 对某单组进行分类,指定优先级,值可为container、system、secondary和alternative

android: enable 指定该菜单组中全部 单项是否可用

android: visible 指定该菜单组中全部某单项是否可见

<item>标记中还可包含**<menu>标记**,用于显示子菜单。
<group>标记中可有多个**<item>标记**,用于组成菜单组。

html 复制代码
//例
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    
    <item android:title="item1"
        android:icon="@drawable/zerotwo"
        app:showAsAction="always"/>
    <item android:title="item2">
        <menu>
            <item android:title="item2_1"/>
            <item android:title="item2_2"/>
        </menu>
    </item>
    <group>
        <item android:title="item3"/>
        <item android:title="item4"/>
    </group>

</menu>

1. 上下文菜单

长按注册的控件显示菜单。

java 复制代码
public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        ... ...
        TextView textView=findViewById(R.id.textView);
        registerForContextMenu(textView);
    }

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        //用于创建菜单(上下文菜单)
        MenuInflater menuInflater=new MenuInflater(this);
        menuInflater.inflate(R.menu.test,menu);
    }

    public boolean onContextItemSelected(MenuItem item) {
        //用于选择菜单项(上下文菜单)
        int id=item.getItemId();
        if(id==R.id.~){
            ~
        }
        return true;
    }

}

2. 选项菜单

点击标题栏或工具栏最右侧三个点显示菜单

如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。

使用ToolBar时要使用 setSupportActionBar( toolBar) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。

java 复制代码
public class MainActivity extends AppCompatActivity {

    public boolean onCreateOptionsMenu(Menu menu) {
        //用于创建菜单(选项菜单/溢出菜单)
        MenuInflater menuInflater=new MenuInflater(this);
        menuInflater.inflate(R.menu.test,menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        //用于选择菜单项(选项菜单/溢出菜单)
        int id=item.getGroupId();
        if(id==R.id.~){
            ~
        }
        return true;
    }

}

3. 溢出菜单

溢出菜单和选项菜单并无较大差别,均是点击标题栏ActionBar或工具栏ToolBar最右侧三个点显示菜单

如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。

使用ToolBar时要使用 setSupportActionBar( toolBar) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。

菜单栏默认不在某单列表中显示图标;可制作自定义方法来使其显示图标。

java 复制代码
//用于使菜单项在列表中显示图片的自定义方法
class MyMenuUtil{
    public static void setOverflowIconVisible(int featureId,Menu menu){
        //ActionBar的featureId是8,ToolBar的featureId是108
        if(featureId%100== Window.FEATURE_ACTION_BAR&&menu!=null){
            if(menu.getClass().getSimpleName().equals("MenuBuilder")){
                try {
                    //setOptionalIconsVisible是隐藏方法,需要反射机制调用。
                    Method m=menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu,true);
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}
java 复制代码
public class MainActivity extends AppCompatActivity {

    public boolean onMenuOpened(int featureId, Menu menu) {
        //打开菜单时调用
        //设置在菜单栏中显示图标
        MyMenuUtil.setOverflowIconVisible(featureId,menu);
        return super.onMenuOpened(featureId, menu);
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        //用于创建菜单(溢出菜单/选项菜单)
        MenuInflater menuInflater=new MenuInflater(this);
        menuInflater.inflate(R.menu.test,menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        //用于选择菜单项(溢出菜单/选项菜单)
        int itemId=item.getItemId();
        int groupId=item.getGroupId();
        if(itemId==R.id.~){
            ~
        }
        return true;
    }
}
相关推荐
佛系打工仔7 分钟前
绘制K线入门
android
C雨后彩虹8 分钟前
竖直四子棋
java·数据结构·算法·华为·面试
疾风sxp12 分钟前
nl2sql技术实现自动sql生成之langchain4j SqlDatabaseContentRetriever
java·人工智能·langchain4j
一勺菠萝丶43 分钟前
PDF24 转图片出现“中间横线”的根本原因与终极解决方案(DPI 原理详解)
java
姓蔡小朋友1 小时前
Unsafe类
java
一只专注api接口开发的技术猿1 小时前
如何处理淘宝 API 的请求限流与数据缓存策略
java·大数据·开发语言·数据库·spring
荒诞硬汉1 小时前
对象数组.
java·数据结构
期待のcode1 小时前
Java虚拟机的非堆内存
java·开发语言·jvm
黎雁·泠崖1 小时前
Java入门篇之吃透基础语法(二):变量全解析(进制+数据类型+键盘录入)
java·开发语言·intellij-idea·intellij idea
仙俊红1 小时前
LeetCode484周赛T4
java