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

相关推荐
松仔log5 小时前
Java中级——组合和继承
android·java·开发语言
我命由我123458 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
lilian2339 小时前
Harmony os 技术实战|拼豆制图06:收藏 ID、生成记录与重启恢复怎么不打架
android·java·数据库·harmonyos
2601_9557596210 小时前
ClaudeAPI成本中心与业务标签设计指南
android·java·数据库
余衫马10 小时前
2026最新版!Android Studio 极速安装与配置指南
android·ide·android studio
AFinalStone10 小时前
Android 7系统异常问题排查(五)Framework层(下)—System Server崩溃
android·tombstone·系统异常
AFinalStone10 小时前
Android 7系统异常问题排查(八)系统追踪—Trace机制与性能诊断
android·系统异常
极客猴子14 小时前
Android录音转写频繁卡顿?多款APP长时间会议场景稳定性实测
android·人工智能·智能手机·飞书
Kapaseker14 小时前
Boolean 变量到底该怎么命名?
android·kotlin
AFinalStone14 小时前
Android 7系统异常问题排查(六)应用异常(上)—ANR机制全解
android·系统异常