参考链接: https://blog.csdn.net/u011494285/article/details/86681405

API >= 24 (Android 7.0) 以上会自动适配全面屏, 但项目中发现嵌套在 Activity 中的 Fragment 在华为的刘海机型上有异常显示. 所以花了些时间适配.

工具类:

NotchUtils.class

import android.app.Activity;
import android.os.Build;
import android.text.TextUtils;
import android.view.DisplayCutout;import java.lang.reflect.Method;/*** Created by geekqian on 2019/11/18.* 描述: 刘海屏判断工具类*/
public class NotchUtils {/*** 是否有刘海屏** @return*/public static boolean hasNotchInScreen(Activity activity) {try {// android  P 以上有标准 API 来判断是否有刘海屏if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {DisplayCutout displayCutout = activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();if (displayCutout != null) {// 说明有刘海屏return true;}} else {// 通过其他方式判断是否有刘海屏  目前官方提供有开发文档的就 小米,vivo,华为(荣耀),oppoString manufacturer = Build.MANUFACTURER;if (TextUtils.isEmpty(manufacturer)) {return false;} else if (manufacturer.equalsIgnoreCase("HUAWEI")) {return hasNotchHw(activity);} else if (manufacturer.equalsIgnoreCase("xiaomi")) {return hasNotchXiaoMi(activity);} else if (manufacturer.equalsIgnoreCase("oppo")) {return hasNotchOPPO(activity);} else if (manufacturer.equalsIgnoreCase("vivo")) {return hasNotchVIVO(activity);} else {return false;}}} catch (Exception e) {LogUtils.print(e.getMessage());return false;}return false;}/*** 判断vivo是否有刘海屏* https://swsdl.vivo.com.cn/appstore/developer/uploadfile/20180328/20180328152252602.pdf** @param activity* @return*/private static boolean hasNotchVIVO(Activity activity) {try {Class<?> c = Class.forName("android.util.FtFeature");Method get = c.getMethod("isFeatureSupport", int.class);return (boolean) (get.invoke(c, 0x20));} catch (Exception e) {e.printStackTrace();return false;}}/*** 判断oppo是否有刘海屏* https://open.oppomobile.com/wiki/doc#id=10159** @param activity* @return*/private static boolean hasNotchOPPO(Activity activity) {return activity.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");}/*** 判断xiaomi是否有刘海屏* https://dev.mi.com/console/doc/detail?pId=1293** @param activity* @return*/private static boolean hasNotchXiaoMi(Activity activity) {try {Class<?> c = Class.forName("android.os.SystemProperties");Method get = c.getMethod("getInt", String.class, int.class);return (int) (get.invoke(c, "ro.miui.notch", 0)) == 1;} catch (Exception e) {e.printStackTrace();return false;}}/*** 判断华为是否有刘海屏* https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114** @param activity* @return*/private static boolean hasNotchHw(Activity activity) {try {ClassLoader cl = activity.getClassLoader();Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen");return (boolean) get.invoke(HwNotchSizeUtil);} catch (Exception e) {return false;}}}

产生异常是因为刘海屏自动适配时把 Layout 下移了一个状态栏的高度, 所以处理方式是代码动态的把底部的控件向上偏移状态栏的高度, 在 FragmentonViewCreated 方法中, 使用:

if (NotchUtils.hasNotchInScreen(mActivity)){ViewGroup.LayoutParams params = mRlInput.getLayoutParams();RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(params);int barHeight = StatusBarUtil.getStatusBarHeight(mActivity);layoutParams.setMargins(0,0,0, barHeight);//4个参数按顺序分别是左上右下layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);mRlInput.setLayoutParams(layoutParams);
}

getStatusBarHeight(activity)

/*** 获取状态栏的高度*/
public static int getStatusBarHeight(Activity activity) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {return 0;}Resources resources = activity.getResources();int identifier = resources.getIdentifier("status_bar_height", "dimen", "android");return resources.getDimensionPixelOffset(identifier);
}

Android 刘海屏全面屏适配相关推荐

  1. android获取刘海屏状态栏高度,Android刘海屏全面屏底部导航栏的适配

    关于Android状态栏和虚拟导航栏的适配,文章:https://blog.csdn.net/leogentleman/article/details/54566319 讲的很不错. 状态栏的适配: ...

  2. Android刘海屏、水滴屏全面屏适配

    现在,市面上的屏幕尺寸和全面屏方案五花八门.这里我使用了小米的图来说明: 上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖.为便于说明,后文提到的「刘海屏」「刘海区」 ...

  3. Android刘海屏、水滴屏全面屏适配详解

    现在,市面上的屏幕尺寸和全面屏方案五花八门.这里我使用了小米的图来说明: 上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖.为便于说明,后文提到的「刘海屏」「刘海区」 ...

  4. Android刘海屏、水滴屏全面屏适配。

    现在,市面上的屏幕尺寸和全面屏方案五花八门.这里我使用了小米的图来说明:上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖.为便于说明,后文提到的「刘海屏」「刘海区」都 ...

  5. Android 刘海屏全屏适配(沉溺式状态栏,隐藏状态栏)

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)override fun onCreate(savedInstanceState: Bundle?) {super. ...

  6. cocos2dx lua 3.14 适配 安卓 刘海屏 全面屏 异形屏

    1,cnonfig.lua   目的是为了以高为极限. autoscale = "EXACT_FIT", 修改成 FIXED_HEIGHT ,2,接下来的场景.每个场景都要自己算位 ...

  7. Android刘海屏、水滴屏全面屏适配方案

    原文地址:https://www.jianshu.com/p/2b8db60ba8df 我将适配方案整理后,封装成了一个库并上传至github,可参考使用 项目地址: https://github.c ...

  8. Android刘海屏、水滴屏全面屏适配方案,海量算法高频面试题精编解析

    对Activity生效,意味着可以针对单个页面进行刘海屏适配,设置了该属性的Activity系统将不会做特殊处理: 方案二 对Application生效,意味着该应用的所有页面,系统都不会做竖屏场景的 ...

  9. Android刘海屏如何适配?一份详细的Android刘海屏、水滴屏全面屏适配方案

    市面上的屏幕尺寸和全面屏方案五花八门. 上述两种屏幕都可以统称为刘海屏,不过对于右侧较小的刘海,业界一般称为水滴屏或美人尖.为便于说明,后文提到的「刘海屏」「刘海区」都同时指代上图两种屏幕. 当我们在 ...

最新文章

  1. 剑指offer 26:复杂链表的复制
  2. Oracle中的备份和恢复之前必须知道的
  3. 单向链表的有关操作(链式存储结构)
  4. DPDK 内存池rte_mempool实现(二十三)
  5. python加载模型_解决python 无法加载downsample模型的问题
  6. 数据--第23课 - 队列的优化实现
  7. fastjson SerializerFeature
  8. 计算机专业过度饱和,教育部:撤销518个本科专业,计算机专业也被撤销,市场饱和了?...
  9. 软件开发中JAVA编程语言的应用
  10. 应届毕业生软件测试面试流程、面试问题总结
  11. Web 攻防第一阶段 I-03:收集 Web 站点信息
  12. 如何评价兰州交通大学的软件工程专业?
  13. 林海峰讲的python_python常用模块-------转自林海峰老师
  14. 微信小程序通过url 上传远端图片 到微信小程序临时素材库 java
  15. ns-3脚本初识——WIFI无线网络:third脚本
  16. windows配置Redis访问时只能用localhost不能用ip访问
  17. PointWise 18.4 R4 x64
  18. 白竹机器人_白术防风黄芪功效作用
  19. 今天聊聊L2级别自动驾驶到底是个什么鬼?
  20. linux中more命令的意思,linux中的more命令的详细解释

热门文章

  1. 1990-2015年中国30万以上城市建成区标准化数据集
  2. Hadoop MapReduce框架介绍
  3. HDU - 5709 Claris Loves Painting 线段树动态开点+合并
  4. 初学者怎么入门单片机?玩哪款单片机容易?
  5. 基础 | batchnorm原理及代码详解
  6. FastJson实现复杂对象序列化与反序列化
  7. 如何为vCenter6.0重置SSO管理员密码
  8. criteria和oracle数据库使用,java-使用Hibernate Criteria和Oracle更好地与时间打交道?...
  9. ES中删除索引中某个字段
  10. 学以致用——一键生成所有Excel图表类型 (Generate all Excel graphs with one click)