Android——Menu基础使用

Menu

顾名思义,menu是一个菜单,在一个app中一个Activity中通常要显示非常多的菜单,但是手机的屏幕空间非常有限,因此充分利用屏幕空间在手机界面设计中就变得非常重要,如果你的活动中有非常多的菜单要显示,就可以使用Android中的menu

1.创建menu.xml文件

首先在项目res资源文件夹下新建menu文件夹

然后在该文件夹下新建一个menu.xml类型的文件

main_activity_menu.xml代码

xml 复制代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <group>
      <!--每个item必须得有自己独立的id和title(title可以重名)-->
      <item android:id="@+id/share"
          android:title="分享"
          />
      <item android:id="@+id/delete"
          android:title="删除"
          />
      <item android:id="@+id/edit"
          android:title="编辑"
          />
  </group>
</menu>

此时左侧的预览框其实已经能显示出来menu被放入Activity后的样子了

差不多这样

然后在MainActivity中注入该menu

在MainAvtivity中重写OnCreateOptionsMenu方法,在方法体注入我们刚刚写好的menu

java 复制代码
getMenuInflater().inflate(R.menu.main_activity_menu,menu);

MainActivity代码

java 复制代码
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_activity_menu,menu);
        return super.onCreateOptionsMenu(menu);
    }
}

此时运行项目模拟器上面已经可以显示出menu了

标题栏上的三个小点就menu,点击之后显示所有菜单。

菜单点击(被选择的时候的回调方法)onOptionsItemSelected(MenuItem item)

java 复制代码
    /**
     *
     * @param item 记得刚刚创建main_activity_menu时自己创建的item项吗?这个参数就是你在menu中选中(点击)的那个item
     * @return
     */
    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //通过获取选择(点击)的MenuItem的id来判断你选择了哪一项
        switch (item.getItemId()){
            case R.id.share:
                Toast.makeText(this, "你选择了分享菜单", Toast.LENGTH_SHORT).show();break;
            case R.id.delete:
                Toast.makeText(this, "你选择了删除菜单", Toast.LENGTH_SHORT).show();break;
            case R.id.edit:
                Toast.makeText(this, "你选择了编辑菜单", Toast.LENGTH_SHORT).show();break;
        }
        return super.onOptionsItemSelected(item);
    }

在MainActivity中重写此方法,通过item.getItemId()获取MenuItem的id然后进行逻辑代码的编写。就可以得到下图的效果

在代码中添加(不使用menu.xml)

使用menu.add()方法,该方法有多个重载,讲几个常用的

arduino 复制代码
menu.add(String title) //添加一个menuItem,并传入title
php 复制代码
   /** 
     *
     * @param groupId 代表MenuItem添加进入菜单组的groupId
     * @param id      代表MenuItem添本身的id
     * @param order   代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
     * @param title   代表当前MenuItem的title
     * @return
     */
menu.add(int groupId,int id,int order,String title)

将上面代码按照动态添加的方法放入menu,也能达到一样的效果

java 复制代码
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(1,R.id.share,0,"分享");
        menu.add(1,R.id.delete,0,"删除");
        menu.add(1,R.id.edit,0,"编辑");
        return super.onCreateOptionsMenu(menu);
    }

icon和showAsAction属性

在之前的main_activity_menu.xml上为每个item添加上这些属性

xml 复制代码
<?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">
  <group>
      <item android:id="@+id/share"
          android:title="分享"
          android:icon="@drawable/share"
          app:showAsAction="always"
          />
      <item android:id="@+id/delete"
          android:title="删除"
          android:icon="@drawable/delete"
          app:showAsAction="always"
          />
      <item android:id="@+id/edit"
          android:title="编辑"
          android:icon="@drawable/edit"
          app:showAsAction="always"
          />
  </group>
</menu>

icon属性:表示菜单的图标

showAsAction: 指定菜单项的显示方式。常用的有ifRoom、never、always、withText,多个属性值之间可以使用|隔开

showAsAction的可选属性值:

名称 效果
always 菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显示范围。
ifRoom 在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。
withText 无论菜单项是否定义了icon属性,都只会显示它的标题,而不会显示图标。使用这种方式的菜单项默认会被收纳入溢出菜单中。
never 菜单项永远只会出现在溢出菜单中。

添加上述参数后页面的显示效果:

可以看到标题栏上多了三个菜单项,显示的形式都是图标。

留下伏笔 收纳溢出菜单中菜单项的显示那么像列表,那有没有像ExpandableListView这样子类似的二级列表呢?

之后更会有menu和底部导航栏的梦幻联动

相关推荐
liang_jy3 小时前
Android 窗口容器树(一)—— 窗口和窗口容器树
android·源码
HUGu RGIN3 小时前
MySQL--》如何在MySQL中打造高效优化索引
android·mysql·adb
Joseph Cooper6 小时前
Linux/Android 跟踪技术:ftrace、TRACE_EVENT、atrace、systrace 与 perfetto 入门
android·linux·运维
空中海6 小时前
安卓逆向03. 动态调试、抓包分析与 Frida Hook
android
一起搞IT吧7 小时前
相机Camera日志实例分析之二十:相机Camx【照片后置4800/5000/6400万拍照】单帧流程日志详解
android·嵌入式硬件·数码相机·智能手机
jinanwuhuaguo8 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
千码君201610 小时前
Trae:一些关于flutter和 go前后端开发构建的分享
android·flutter·gradle·android-studio·trae·vibe code
重生之我是Java开发战士13 小时前
【MySQL】事务 & 用户与权限管理
android·数据库·mysql
怣疯knight15 小时前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
ke_csdn15 小时前
从Java演变到Kotlin下的jet pack
android