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

相关推荐
你过来啊你16 分钟前
Android Glide使用与底层机制详解
android
血舞之境17 分钟前
Android 模块打包成aar遇到的空指针的问题
android
嘉小华18 分钟前
Android 协程全景式深度解析:第四章 Flow响应式流
android·前端
用户19823331884019 分钟前
让PAG动画在富文本中动起来
android·kotlin
嘉小华21 分钟前
Android 协程全景式深度解析:第五章 协程与Android整合
android
软***c26 分钟前
手机恢复出厂设置怎么找回数据?Aiseesoft FoneLab for Android数据恢复工具分享
android·智能手机·安卓手机恢复数据·手机格式化找回数据
沙振宇35 分钟前
【Qt 学习之路】Qt Android开发环境搭建:Ubuntu的Vmware虚拟机中的踩坑实录
android·qt·学习
苏金标1 小时前
android 的软件盘
android
wkj0012 小时前
php中调用对象的方法可以使用array($object, ‘methodName‘)?
android·开发语言·php
wkj0012 小时前
php use 命名空间与 spl_autoload_register的关系
android·php·android studio