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和底部导航栏的梦幻联动

相关推荐
Kapaseker6 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴6 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭16 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab17 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋1 天前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我2 天前
让我们实现一个更好看的内部阴影按钮
android·flutter