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;
    }
}
相关推荐
狼爷29 分钟前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
念何架构之路33 分钟前
zap扩展生态与总结
java·前端·数据库
第七页独白1 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
传奇开心果编程1 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
mmsx1 小时前
Android 地图数据链路:从 GDAL、KML 到多引擎适配
android·kotlin
QCoding2 小时前
Spring AI Alibaba Graph实战:从ReAct Agent到Workflow,企业AI复杂流程该如何编排?
java·人工智能
用户094248568032 小时前
第25章:Java虚拟线程(Project Loom)实战与调度协作
java·jvm
2601_968900772 小时前
大模型版本回归评估实战:从能力指标到额度口径的完整链路
android·数据挖掘·回归
砚底藏山河2 小时前
量化实战:截面因子有效性检验(IC 分析与分层回测)
java·python·金融·maven
wuminyu2 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++