返回顶部
首页 > 资讯 > 移动开发 >Android动态更新Menu菜单的实现过程
  • 516
分享到

Android动态更新Menu菜单的实现过程

2024-04-02 19:04:59 516人浏览 薄情痞子
摘要

目录1. 需求描述2. 基础知识3. 菜单加载4. 需求实现5. 总结1. 需求描述 Android Menu菜单是比较常见的功能,在ActionBar  or ToolB

1. 需求描述

Android Menu菜单是比较常见的功能,在ActionBar  or ToolBar上显示,点击更多(3个点),会有下拉列表菜单展示,  在工作项目中有个小需求改动: 在 ToolBar上添加一个图标,点击后会切换图标状态,界面也会显示对应内容,这也是本篇文章要讲的是如何动态更新Menu菜单。

首先,我们来看看效果图:

1. 当点击网格图标时,显示为网格模式

 2. 当点击列表图标时,显示为列表模式

 3. 点击更多图标时,显示更多菜单列表:设置   关于  测试

2. 基础知识

在写代码之前,先来复习一下Menu的基础知识,具体可以看官方文档:Menus  |  Android Developers

菜单xml编写例子:

<menu xmlns:android="Http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.menutest.MainActivity">
 
    <item
        android:id="@+id/sub_menu_grid"
        android:title="网格视图"
        android:icon="@drawable/ic_menu_view_grid"
        app:showAsAction="always"/>
    <item
        android:id="@+id/sub_menu_list"
        android:title="列表视图"
        android:icon="@drawable/ic_menu_view_list"
        app:showAsAction="always"/>
 
    <item
        android:id="@+id/action_settings"
        android:orderInCateGory="100"
        android:title="设置"
        app:showAsAction="never" />
 
    <item
        android:id="@+id/action_about"
        android:orderInCategory="200"
        android:title="关于"
        app:showAsAction="never" />
 
    <item
        android:id="@+id/action_test"
        android:orderInCategory="300"
        android:title="测试"
        app:showAsAction="never" />
 
</menu>

<item>是我们主要需要关注的元素,它的常见属性如下:

    android:id:     菜单项(MenuItem)的唯一标识(必须定义)

    android:icon: 菜单项的图标(可选)

    android:title: 菜单项的标题(必选)

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

指定菜单的显示方式:

always:菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显示范围。

ifRoom:在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。

withText:无论菜单项是否定义了icon属性,都只会显示它的标题,而不会显示图标。使用这种方式的菜单项默认会被收纳入溢出菜单中。

never:菜单项永远只会出现在溢出菜单中。

我们通过上面的3张图片,在Toolbar上面显示有两类菜单:

1. 比如网格和列表菜单,在菜单栏上定义为一直显示(always),我们称它为常驻菜单

2. 另一种会被集中放置到溢出菜单中(就是菜单栏右侧的3个小点图标图标)

3. 菜单加载

菜单加载,有两个相关api 

  1.  onCreateOptionsMenu(Menu menu)

      此方法在初次加载菜单时,会调用一次。

2.  onPrepareOptionsMenu(Menu menu)

      此方法应用场景:在运行时更改菜单项,我们看看官网的描述:

在运行时修改的选项菜单:

系统调用onCreateOptionsMenu方法后,将保留创建的Menu实例。除非菜单由于某些原因而失效,否则不会再次调用onCreateOptionsMenu。因此,我们只应该使用onCreateOptionsMenu来创建初始菜单状态,而不应使用它在Activity生命周期中对菜单执行任何更改。

如果需要根据在Activity生命周期中发生的某些事件修改选项菜单,则应该通过onPrepareOptionsMenu方法实现。这个方法的参数中有一个Menu对象(即旧的Menu对象),我们可以使用它对菜单执行修改,如添加、移除、启用或禁用菜单项。(Fragment同样提供onPrepareOptionsMenu方法,只是不需要提供返回值)

需要注意:在Android 3.0及更高版本中,当菜单项显示在应用栏中时,选项菜单被视为始终处于打开状态,说的就是常驻菜单。发生事件时,如果要执行菜单更新,则必须调用 invalidateOptionsMenu来请求系统调用onPrepareOptionsMenu方法

对于上句话我的理解如下:

1. 对于常驻菜单,如果你想动态修改菜单的话,就必须调用 invalidateOptionsMenu() 方法去更新,为什么呢? 因为调用 invalidateOptionsMenu方法后,会重新执行一遍 onCreateOptionsMenu 和 onPrepareOptionsMenu这两个方法。

2. 对于溢出菜单,如果你想动态修改菜单的话,只需要在onPrepareOptionsMenu方法中实现即可,为什么呢?

当你点击 更多(3个小点)图标的时候,就会回调onPrepareOptionsMenu方法

4. 需求实现

有了上面理论做支持,具体结合需求,网格和列表菜单属于常驻菜单,所以必须先要调用invalidateOptionsMenu()方法,然后在onPrepareOptionsMenu去写动态更新状态的代码

图三中,关于属于溢出菜单,需求: 关于 菜单不能点击,所以也是在onPrepareOptionsMenu中去写动态更新状态的代码

好了,我把代码展示出来:

public class MainActivity extends AppCompatActivity {
 
    //默认为网格模式
    private boolean isshowGridModeIcon = true;
 
    //网格菜单 和 列表菜单
    private MenuItem gridMenuItem;
    private MenuItem listMenuItem;
 
    //用字符串来表示当前的文件列表显示模式
    private TextView viewModeStatus;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
 
        viewModeStatus = findViewById(R.id.textview_refresh);
 
    }
 
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        Log.e("test", "=====MenuTest onCreateOptionsMenu=====");
 
        gridMenuItem = menu.findItem(R.id.sub_menu_grid);
        listMenuItem = menu.findItem(R.id.sub_menu_list);
        return true;
    }
 
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        Log.e("test", "=====MenuTest onPrepareOptionsMenu=xxxx====");
        MenuItem aboutMenuItem = menu.findItem(R.id.action_about);
 
        // (3个点)【更多】菜单中把 关于 设置为不可点击
        aboutMenuItem.setEnabled(false);
 
        if (isShowGridModeIcon) {
            gridMenuItem.setVisible(true);
            listMenuItem.setVisible(false);
            viewModeStatus.setText("当前为网格模式");
        } else {
            gridMenuItem.setVisible(false);
            listMenuItem.setVisible(true);
            viewModeStatus.setText("当前为列表模式");
        }
        return super.onPrepareOptionsMenu(menu);
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        Log.e("test", "=====MenuTest onOptionsItemSelected= sssss ====");
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        } else if (id == R.id.sub_menu_grid) {
          
          //伪代码:setViewMode(State.MODE_GRID);
            isShowGridModeIcon = false;
          
            invalidateOptionsMenu();
 
        } else if (id == R.id.sub_menu_list) {
            
            //伪代码:setViewMode(State.MODE_LIST);
            isShowGridModeIcon = true;
            
            invalidateOptionsMenu();
        }
 
        return super.onOptionsItemSelected(item);
    }
}

代码中加了打印log

1.  在桌面上启动apk的时候,打印log如下:

21900 21900 E test    : =====MenuTest onCreateOptionsMenu=====
21900 21900 E test    : =====MenuTest onPrepareOptionsMenu=xxxx====

2. 点击网格模式菜单时,打印log如下:

21900 21900 E test    : =====MenuTest onOptionsItemSelected= sssss ====
21900 21900 E test    : =====MenuTest onCreateOptionsMenu=====
21900 21900 E test    : =====MenuTest onPrepareOptionsMenu=xxxx====

如上分析,在onOptionsItemSelected方法中点击响应时,调用了invalidateOptionsMenu方法,所以会重新走一遍onCreateOptionsMenu, onPrepareOptionsMenu。

3. 点击(3个点)更多菜单时,打印log如下:

21900 21900 E test    : =====MenuTest onPrepareOptionsMenu=xxxx====

如上分析, 对于溢出菜单类型,点击更多菜单时,只会回调onPrepareOptionsMenu方法

5. 总结

本篇文章讲解了动态菜单更新显示的过程,也是对menu菜单的一个小结,对于同类需求,可以仿照此demo,整个Demo代码我上传到这里:Android动态更新Menu菜单

到此这篇关于Android动态更新Menu菜单的文章就介绍到这了,更多相关Android动态更新Menu菜单内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android动态更新Menu菜单的实现过程

本文链接: https://lsjlt.com/news/166969.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android动态更新Menu菜单的实现过程
    目录1. 需求描述2. 基础知识3. 菜单加载4. 需求实现5. 总结1. 需求描述 Android Menu菜单是比较常见的功能,在ActionBar  or ToolB...
    99+
    2024-04-02
  • Android动态添加menu菜单的简单方法
    从menu按键开始,涉及以下3个方法: 1、onCreateOptionsMenu(Menu menu)2、onPrepareOptionsMenu(Menu menu)3、o...
    99+
    2022-06-06
    方法 Android
  • Android动态修改ToolBar的Menu菜单示例
    Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了。...
    99+
    2022-06-06
    示例 toolbar Android
  • android菜单menu如何实现
    在Android中,可以通过以下步骤来实现菜单(Menu):1. 在res目录下的menu文件夹中创建一个XML文件,用于定义菜单的...
    99+
    2023-09-22
    android
  • Android 动态菜单实现实例代码
    Android 动态菜单 先上效果图 比较简单,主要就是属性动画的使用和坐标角度的小细节。 实现 实现效果: 图标按照路径一路缩放渐变过来即可。 核心代码 pri...
    99+
    2022-06-06
    菜单 动态 Android
  • 如何在Android项目中动态修改ToolBar中的Menu菜单栏
    如何在Android项目中动态修改ToolBar中的Menu菜单栏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android动态修改ToolBar的Menu菜单实现很简单...
    99+
    2023-05-31
    toolbar android menu
  • DjangoVue实现动态菜单和动态权限
    目录用户与用户组的架构设计动态菜单和权限的设计思路与实现Vue 端如何实现动态路由Django 端如何实现动态权限随着前后端分离架构的流行,在 web 应用中,RESTful API...
    99+
    2024-04-02
  • Android编程基础之Menu功能菜单设计实例
    本文实例讲述了Android编程中的Menu功能菜单。分享给大家供大家参考,具体如下: Android功能菜单的设计,程序里定义了两个菜单子项,一个是"关于",一个是"退出",...
    99+
    2022-06-06
    菜单 Android
  • Android编程之菜单Menu的创建方法示例
    本文实例讲述了Android编程之菜单Menu的创建方法。分享给大家供大家参考,具体如下:在res目录下的menu文件夹下创建一个main.xml文件,内容如下:<?xml version="1.0" encoding="ut...
    99+
    2023-05-30
    android 菜单 menu
  • Android仿微信菜单(Menu)(使用C#和Java分别实现)
    本篇是对安卓菜单使用编程方式实现,当然可以使用XML的方式完成同样的功能,基本Java和C#写法都是一致的,所以使用XML的方式在本篇中使用Java演示,需要注意的是,对于如果...
    99+
    2022-06-06
    菜单 C# JAVA Android
  • Flutter3.7新增Menu菜单组件的使用教程分享
    目录菜单组件介绍MenuAnchor组件SubmenuButton 联级菜单按钮MenuItemButton 菜单按钮组件MenuBar 多菜单联级菜单头部Bar菜单样式 MenuS...
    99+
    2023-01-31
    Flutter Menu菜单组件 Flutter 菜单组件 Flutter 菜单
  • vue实现三级联动动态菜单
    本文实例为大家分享了vue实现三级联动动态菜单的具体代码,供大家参考,具体内容如下 三级联动动态菜单展示:一级菜单选中,生成二级菜单数据,二级菜单选中,生成三级菜单数据(根据上一级菜...
    99+
    2024-04-02
  • Android实现左侧滑动菜单
    本文实例为大家分享了Android实现左侧滑动菜单的具体代码,供大家参考,具体内容如下 效果图: SlideActivity.java: package com.demo.slid...
    99+
    2024-04-02
  • Android中怎么实现多语言动态更新
    本篇文章为大家展示了Android中怎么实现多语言动态更新,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、问题一:翻译容易出错翻译的流程是客户端开发编写中文文案---翻译成英文----外包翻译根据...
    99+
    2023-06-04
  • Android 2.3.7.r1 camera录像过程中按menu菜单键时会停止录像
    Android 2.3.7.r1 按menu键时会停止录像。改成录像时按menu键不做处理,可做如下修改: 在packages/apps/CameraOpen/src/com/...
    99+
    2022-06-06
    Android
  • el-menu动态加载路由的实现
    先看需要实现的效果 这里有一级也有二级菜单,注意二级菜单的父目录(”选项设置“点击不会跳转,只是展开目录),然后点击去详情页,需要跳到一个隐藏的路由,不在菜...
    99+
    2023-05-15
    el-menu动态加载路由 el-menu动态路由
  • Vue el-menu 左侧菜单导航功能的实现
    目录引言一级菜单实现最简单的一级菜单设置菜单背景颜色和文字颜色设置选中后菜单文字颜色在菜单中加入图标二级菜单实现二级菜单修改分析【其实很简单】:三级菜单实现三级菜单实现点击菜单跳转小...
    99+
    2024-04-02
  • LayUI+Shiro实现动态菜单并记住菜单收展的示例
    目录一、Maven 依赖二、菜单相关的类1、主菜单2、子菜单三、Shiro 配置1、ShiroConfig2、自定义shiro密码校验四、控制类1、LoginController2、...
    99+
    2024-04-02
  • 如何通过脚本实现数据动态更新
    在数据填报的场景中,常常会遇到根据条件动态更新数据的需求,例如:在条件 A 下将页面所有数据插入到数据库表中,而在条件 B 下则将页面中做了修改的数据更新到数据库表中。遇到这种需求,脑海中的第一个想法就是:存储过程更新、或者 java 代码...
    99+
    2023-06-02
  • css如何实现动态二级菜单
    这篇文章将为大家详细讲解有关css如何实现动态二级菜单,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。动态实现简单的二级菜单当鼠标放到一级标签上时,鼠标会变成小手的形状 展示二级菜单,源码如下,复制即可直接...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作