Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题

前言

本篇博客记录一下小巫在使用actionbar的时候遇到关于溢出菜单的一些问题:

  1. 什么是Overflow menu
  2. Android 3.0以上默认不显示overflow menu
  3. 如何强制在Android 4.4.4以下的手机显示overflow menu
  4. 经测试,魅族手机无法强制显示overflow menu,其他手机暂无发现这种问题
先来两张对比图:
左边是红米手机的效果,右边是针对魅族Mx4pro做的适配效果。

什么是overflow menu?

先来解释一下什么是overflow menu,中文叫做“溢出菜单”,顾名思义溢出的菜单,我们有些手机是有实体按键或虚拟按键,其中一个是菜单键,有的可能没有,例如魅族就只有一个back的返回虚拟键。点击菜单键的时候,就会在底部弹出溢出菜单,在Android 3.0之后,也就是API 11之后才可以加入ActionBar控件的,再其右上角会有三个点,那个就是我们说的overflow menu,我们在menu中定义菜单项就可以弹出类似上面红米手机弹出的效果。关于ActionBar有很多用法,本篇博客就不展开讲,有兴趣的同学可以到官网进行学习。

如何在ActionBar强制显示溢出菜单?

Android 3.0以上的手机默认是不显示溢出菜单的,那如何强制在Android 4.4以下的手机显示溢出菜单呢?可以使用以下方法:
// 强制actionbar显示overflow菜单// force to show overflow menu in actionbar for android 4.4 belowprivate void getOverflowMenu() {try {ViewConfiguration config = ViewConfiguration.get(this);Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");if (menuKeyField != null) {menuKeyField.setAccessible(true);menuKeyField.setBoolean(config, false);}} catch (Exception e) {e.printStackTrace();}}

适配类似魅族手机无法显示溢出菜单的解决方案

上面已经解决了如何在Android 4.4以下的手机强制显示溢出菜单,下面来解决一些奇葩手机无法显示溢出菜单的问题。为什么魅族手机无法显示,了解到的是魅族没有所谓的actionbar,它们称为smartbar,看来是魅族的工程师把官方的actionbar进行了修改。一个字,坑!不过小巫想到了一个解决办法,我们每部手机都有自己的手机品牌,我们可以针对这些奇葩手机进行适配,溢出菜单我们就使用popupwindow来替代
获得手机信息
/*** 获取IMEI号,IESI号,手机型号*/public static void getInfo(Context context) {TelephonyManager mTm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String imei = mTm.getDeviceId();String imsi = mTm.getSubscriberId();String mtype = android.os.Build.MODEL; // 手机型号String mtyb = android.os.Build.BRAND;// 手机品牌String numer = mTm.getLine1Number(); // 手机号码,有的可得,有的不可得Log.i("text", "手机IMEI号:" + imei + "手机IESI号:" + imsi + "手机型号:" + mtype+ "手机品牌:" + mtyb + "手机号码" + numer);}

获取手机品牌

/*** 得到手机品牌* @return*/public static String getPhoneBrand() {return android.os.Build.BOARD;}

得到手机品牌之后,我们就在创建溢出菜单的时候进行判断:

1. 如果是魅族手机,则加载自定义菜单
2. 如果不是,则使用系统的溢出菜单,加载菜单内容
@Overridepublic void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {// Inflate the menu; this adds items to the action bar if it is present.super.onCreateOptionsMenu(menu, inflater);String brand = PhoneUtils.getPhoneBrand();if ("mx4pro".equals(brand)) {inflater.inflate(R.menu.overflow_menu, menu);} else {inflater.inflate(R.menu.main, menu);}}

溢出菜单文件
/res/menu/main.xm
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/menu_hotest"android:orderInCategory="100"android:showAsAction="never"android:title="@string/menu_hotest"/><itemandroid:id="@+id/menu_lastest"android:orderInCategory="100"android:showAsAction="never"android:title="@string/menu_lastest"/></menu>

自定义的菜单文件

/res/menu/overflow_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/menu_overflow"android:icon="@drawable/ic_more"android:orderInCategory="100"android:showAsAction="always"android:title="@string/menu_overflow"></item></menu>

自定义菜单就直接给它设置一个actionbar的按钮,图标是那三个点

我们在选中菜单的时候执行我们的业务逻辑
  @Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_overflow:popupOverflowMenu();return true;case R.id.menu_lastest:type = "latest";break;case R.id.menu_hotest:type = "hotest";break;default:break;}return super.onOptionsItemSelected(item);}

如果是魅族mx4pro手机,就弹出我们的自定义菜单,下面是实现:

/*** 弹出自定义溢出菜单*/public void popupOverflowMenu() {// 显示溢出菜单的时候设置背景半透明setWindowAlpha(0.5f); // 获取状态栏高度Rect frame = new Rect();getActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);// 状态栏高度 frame.topint xOffset = frame.top + getActivity().getActionBar().getHeight() - 25; // 减去阴影宽度,适配UIint yOffset = Dp2Dx(getActivity(), 8f); // 设置x方向offset为5dpView parentView = getActivity().getLayoutInflater().inflate(R.layout.fragment_portfolio, null);View popView = getActivity().getLayoutInflater().inflate(R.layout.action_overflow_menu, null);// popView即popupWindow布局PopupWindow popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);// 必须设计BackgroundDrawable后setOutsideTouchable(true)才会有效。这里在XML中定义背景,所以这里为nullpopupWindow.setBackgroundDrawable(new ColorDrawable(0000000000));popupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true); // 点击外部关闭popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);// 设置Gravity,让它显示在右上角popupWindow.showAtLocation(parentView, Gravity.RIGHT | Gravity.TOP, yOffset, xOffset);popupWindow.setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss() {// popupWindow消失时,设置为全透明setWindowAlpha(1f);}});}/*** 设置屏幕透明度* @param alpha*/private void setWindowAlpha(float alpha) {WindowManager.LayoutParams lp = getActivity().getWindow().getAttributes();  lp.alpha = alpha; //0.0-1.0  getActivity().getWindow().setAttributes(lp);}public int Dp2Dx(Context context, float dp) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dp * scale + 0.5f);}

这里就是通过自定义pupupwindow,指定popupwindow的xml布局,这个自己来定,根据父布局来显示popupwindow的位置,当popupwindow显示的时候,设置屏幕为半透明,监听它的消失事件,消失的时候,设置屏幕为全透明效果。最终实现适配魅族手机,这里是小巫想到的一个解决方案,有更好的方法,可以留言交流一下。

Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题相关推荐

  1. Android ActionBar中Overflow Menu(溢出菜单)中的一些问题

    关注微信号:javalearns   随时随地学Java 或扫一扫 随时随地学Java 前言 开始前我们先来关注一下Android Overflow menu的几个相关问题: 什么是Overflow ...

  2. 【Qt】QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action)

    1.简介 QtCreator中使用ActionManager类管理标题栏(MunuBar).菜单(Menu)和菜单中的项目(Action),下面以创建"New"动作为例,介绍Act ...

  3. Toolbar中Overflow Menu不显示问题

    参考谷歌官网https://developer.android.com/training/appbar/setting-up.html#utility google图标图片下载地址:https://d ...

  4. Android菜单详解——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  5. Android的Toolbar(含溢出菜单设置[弹出菜单的使用])的使用PopMenu的样式

    工作内容: Toolbar(含溢出菜单设置[弹出菜单的使用])的使用 学习分享: Toolbar的使用前提:设置主题 <style name="AppTheme" paren ...

  6. android actionbar 背景,Android应用开发之定制页面背景及Actionbar overflow menu的背景色...

    本文将带你了解Android应用开发之定制页面背景及Actionbar overflow menu的背景色,希望本文对大家学Android有所帮助 定义theme和style, 注意是actionOv ...

  7. android 自定义menu 背景颜色,Android中设置Menu菜单的文字颜色为白色

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 开发者交流裙: 188168040 Android中设置Menu菜单的文字颜色为白色,一般情况下,Android中Menu菜单的title文字颜色为黑色, ...

  8. Android菜单详解(一)——理解android中的Menu

    2019独角兽企业重金招聘Python工程师标准>>> 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Men ...

  9. Android中的Menu

    文章目录 1 Menu介绍 1.1 Menu的发展 1.2 菜单的分类 2 选项菜单(OptionMenu) 2.1 选项菜单的xml文件及java文件 3 上下文菜单(ContextMenu) 3. ...

最新文章

  1. 在Vmware中安装Hyper-V
  2. node.js的异步
  3. c++中结构体字符指针成员无法赋值
  4. 草稿-乱-爬虫-post请求数据与Request Payload
  5. 如何计算两个字符串之间的文本相似度?
  6. html的调用方法详解,HTML5标签使用方法详解
  7. LINUX编译autoconf
  8. tftp路由器刷机修复工具_魅族路由器极速版刷老毛子固件教程
  9. MT4API跟单、外汇API跟单接口详解
  10. java解压zip和rar文件
  11. 启动计算机应用程序的命令,如何设置电脑Windows开机启动项命令?
  12. 蓝阔无线打印服务器,蓝阔打印服务器云打印
  13. 微软认知服务应用秘籍 – 君子动口不动手
  14. 黑马SpringBoot --基础篇
  15. 如何区分apk游戏引擎
  16. java如何生成api文档_api文档自动生成工具
  17. 《Filter Pruning using Hierarchical Group Sparse》ICPR2020论文详解
  18. 单片机系统的电磁兼容性设计
  19. 亚马逊ERP系统是什么?他有什么用
  20. python输出语句print i、j、k_Python的打印使用,python,之,print,用法

热门文章

  1. 我的Java学习之路(第十九天)------ 排序算法(冒泡排序、快速排序)
  2. 什么是Arduino?
  3. 世界首例!神经调控成功应用于难治性抑郁症治疗
  4. 「一道面试题」输入URL到渲染全面梳理中-页面渲染篇
  5. B2B网站运营者及优化排名十赌九输-免费套路必是死路
  6. 《炬丰科技-半导体工艺》不破坏MEMS结构的颗粒去除方法
  7. fabric-java-sdk1.3.0 测试End2endIT
  8. Vulkan学习(八): Hello Triangle 重构
  9. Android连上USb不充电,手机连接电脑只显示充电没有usb连接怎么办?
  10. 华为ensp,wireshark3.0.0,virtualbox 5.2.22 安装包