Sofia icon indicating copy to clipboard operation
Sofia copied to clipboard

小米(红米Note5)全面屏隐藏导航栏底部View没有隐藏的问题?

Open DevXue opened this issue 6 years ago • 28 comments

严大,现在用你最新的Demo跑起来,用小米的全面屏手机测试,我在GoodsDetailsActivity中加上了invasionNavigationBar();方法,想让全面屏关闭导航栏的时候 让底部View也隐藏掉,但是没有这个效果,我在之前的issues中也看到了这个问题,不过close掉了, 发现新的项目也存在这个问题,请问严大是我使用的姿势有问题么?求解答!谢谢 1 2 3

DevXue avatar Apr 12 '18 07:04 DevXue

我这边测试了华为手机,隐藏导航栏后进入还是进入后隐藏,都没有问题了。关闭那个issue是因为已经解决了这个问题。小米全面屏这个还没有测试过(按理应该会都兼容到),你是用1.0.5版本吗?是先隐藏后进入还是进入后隐藏的?

yanzhenjie avatar Apr 12 '18 08:04 yanzhenjie

谢回复, 我今天刚下载的Demo,确定是1.0.5, 我是先运行Demo看了效果,然后我把全面屏的导航栏隐藏了,紧接着我把invasionNavigationBar()给加到Demo的GoodsDetailsActivity中,然后运行APP,结果发现 底部的黑色View没有消失 就这个么顺序!

DevXue avatar Apr 12 '18 09:04 DevXue

我猜测出大概原因是这样,例如导航栏本来的高度是50,当导航栏隐藏后,获取到的导航栏高度应该是0,但是目前获取到的导航栏高度还是50,因此没有把导航栏隐藏掉。 不能保证Sofia的获取方法一定的正确的(非反射),所以能否麻烦你帮忙测试一下,在小米全面屏设备上获取不同情况下的导航栏高度。

获取导航栏高度不是获取导航栏理想高度(暂且叫理想高度吧,理想高度在有导航栏或者没有导航栏的手机上都是有值的且固定的,例如50,不同的手机高度不一样),Sofia获取导航栏高度是导航栏实际高度,例如华为上获取可能是50,在小米物理键的机子上获取到是0,这都是没有问题的。

yanzhenjie avatar Apr 12 '18 09:04 yanzhenjie

好的,严大, 我这就去获取小米导航栏高度。
你说的这个获取不同情况导航栏高度是指???

DevXue avatar Apr 12 '18 09:04 DevXue

隐藏导航和先是导航栏的时候,例如:

  1. 先获取一下,隐藏后再获取一下。
  2. 先隐藏再获取,显示后再获取一下。 然后还可以获取一下这个理想高度,就是固定的高度。也可以结合源码看看,主要目的就是判断出现问题的原因。Sofia是根据导航栏实际高度来决定是否隐藏的。

yanzhenjie avatar Apr 12 '18 09:04 yanzhenjie

严大久等了,昨天下班走得早·· 以下是测试结果 红米Note5全面屏:默认有虚拟按键 导航栏高度 :130 红米Note5全面屏:设置中关闭虚拟按键 打开APP 导航栏高度为:130 红米Note5全面屏:再次到设置中开启虚拟按键 打开APP 导航栏高度为:130

没有虚拟按键的 普通小米手机:导航栏高度为:132

获取的方法为: /** * 获取导航栏高度 */ public static int getNavigationBarHeight(Activity activity) { Resources resources = activity.getResources(); int resourceId = resources.getIdentifier("navigation_bar_height","dimen", "android"); //获取NavigationBar的高度 int height = resources.getDimensionPixelSize(resourceId); return height; } 小米是不是和其他手机不一样,他这个虚拟按键隐藏不掉?是不是就算隐藏了 他也是位置还在类似于View中的View.INVISIBLE 属性··

DevXue avatar Apr 13 '18 01:04 DevXue

你获取的这个应该是上面咱俩约定的理想高度,这个高度是一直有的,而且非0。在Sofia的NavigationView中有获取实际高度的方法,你可以每次分别获取一下这两个高度。如果隐藏后获取到实际高度是0,那我能做一些优化。如果隐藏后获取到实际高度不是0,就比较难定位了。谢谢你辅助测试。

yanzhenjie avatar Apr 13 '18 13:04 yanzhenjie

严大客气了, 明天我找我同事的小米全面屏手机按照你说的Sofia的方法再试试,现在身边没有小米的全面屏机子···

DevXue avatar Apr 13 '18 13:04 DevXue

严大,我用的Sofia中的方法 在 NavigationView中找到的 我把NavigationView设置到布局中 然后在MainActivty中初始化 最后调用它的 getDefaultBarSize() ,和getBarSize() 全面屏手机 通过 getBarSize() 方法获取到的值 始终是 0 开启隐藏虚拟按键都是0 全面屏手机 通过getDefaultBarSize()方法获取的值 始终是130 开启隐藏虚拟按键都是130 没有虚拟按键的小米手机亦然···

2 3

我这么调用正确不?

另外 我倒看到小米的文档 也没有给出具体的方案·· https://dev.mi.com/console/doc/detail?pId=1160

DevXue avatar Apr 14 '18 01:04 DevXue

https://windysha.github.io/2018/02/07/Android-APP%E9%80%82%E9%85%8D%E5%85%A8%E9%9D%A2%E5%B1%8F%E6%89%8B%E6%9C%BA%E7%9A%84%E6%8A%80%E6%9C%AF%E8%A6%81%E7%82%B9/ 这个帖子中的介绍, 有方法判断是否存在虚拟按键, 我用不是全面屏的小米手机测试 返回的是false 但是我用是全面屏的小米手机测试 他始终返回true 不管是我隐藏 还是显示虚拟按键 他都返回true 真是奇了怪了日了狗了了!

DevXue avatar Apr 14 '18 03:04 DevXue

上面的获取方法是正确的,但是getBarSize()需要onMeasure()之后才能有值,所以你获取的一直是0。华为是有一个用户手动隐藏的箭头的,我看你的回复,小米全面屏是先隐藏才能进入。你可以试着进入后延迟几秒再使用NavigationView的方法获取。

yanzhenjie avatar Apr 14 '18 03:04 yanzhenjie

按照你说的 测试了一下, 这次延迟了3秒,并且确定是先执行onMeasure()之后,获取的导航栏高度 getBarSize(); 结果:红米Note全面屏 在onMeasure()之后获取高度为 : 130 没有隐藏虚拟按键 结果:红米Note全面屏 在onMeasure()之后获取高度为 : 130 隐藏虚拟按键 结果:普通小米手机 在onMeasure()之后获取高度为 : 0 没有虚拟键 结果:另外一部有虚拟键键的手机在onMeasure()之后获取高度为 : 0 有虚拟键(设置中没有找到关闭虚拟键的功能) 这个不是很理解,这个是有虚拟键的啊 为啥是 0呢?

这个小米全面屏手机 隐藏虚拟键后确实不为 0 严大 这可咋整呀?

1523687672 1

DevXue avatar Apr 14 '18 06:04 DevXue

最后一个有虚拟键的手机是否是Android5.0及以上系统,Android5.0以下不会测量实际高度。如果是Android5.0及以上系统,测量可能就有问题了,不过目前没有人反馈过这个问题。 小米全面屏这个问题,我得找个手机测试一下兼容方案,或者你那边有方案可以直接提供一下监测高度的代码。

yanzhenjie avatar Apr 14 '18 13:04 yanzhenjie

这个 有虚拟按键的手机 是Android 4.4.4的 手机 叫个 YouTaPhone 我也去找找这方面的解决方案!

DevXue avatar Apr 16 '18 01:04 DevXue

红米note5 android8.1系统还有这个问题的,设置了全面屏,但底部还是有黑色区域

faith-hb avatar Apr 16 '18 03:04 faith-hb

@faith-hb 设置了全面屏之后 如果没有底部View的话, 咱们的APP就会到了虚拟按键里头(虚拟按键会覆盖APP), 你APP底部的菜单没法子点击了 你看看微信 QQ 都是 全面屏的状态下 会有个白色的View 显示在虚拟按键上

DevXue avatar Apr 16 '18 03:04 DevXue

问题已解决:将targetSdkVersion版本改成27,亲测有效

faith-hb avatar Apr 16 '18 06:04 faith-hb

@DevXue 你说的都是虚拟按键区域被隐藏的状态下,我的情况是跟楼主发的第二张图那样的一块黑色区域,这个黑色区域应该就是虚拟按键的区域,也就是说压根就没隐藏

faith-hb avatar Apr 16 '18 06:04 faith-hb

没隐藏的是Sofia的那个尾巴,这个尾巴是根据系统的实际虚拟导航栏是否隐藏来决定是否隐藏自己的。 另外想问一下,华为手机是虚拟导航栏上有个向下的箭头点击可以隐藏,上滑又出现。而小米这个是设置中隐藏后再进入App,这样的话如果App中没有回到home的功能,怎么回到桌面呀。有虚拟导航栏应该没有物理键了吧。

yanzhenjie avatar Apr 16 '18 06:04 yanzhenjie

@faith-hb 哥们, 为啥我讲目标版本设置为27 就不行啊!!! @yanzhenjie 另外严大,再问你个问题 红米Note全面屏 在没有关闭虚拟按键的情况下,把导航栏背景颜色设为白色的话 虚拟按键没法子看清楚。 QQ 或者 微信 咸鱼 迅雷等APP 他们的虚拟按键功能键的颜色是灰色, 在Sofia中怎么设置这个颜色呢?

dsfsf

DevXue avatar Apr 16 '18 08:04 DevXue

@DevXue 你试试灰色状态栏那个方法有用不,这个确实是一个问题,前面有人提了,我暂时没时间研究这个。后面会适配到。

yanzhenjie avatar Apr 16 '18 08:04 yanzhenjie

@yanzhenjie 设置了statusBarDarkFont(); 没用, 导航栏按键没变成灰色

DevXue avatar Apr 16 '18 08:04 DevXue

好的,俩问题一起弄。

yanzhenjie avatar Apr 16 '18 08:04 yanzhenjie

虚拟按键颜色的支持 https://github.com/yanzhenjie/Sofia/pull/24

sovegetables avatar Apr 20 '18 08:04 sovegetables

小米MIX2 设置了全面屏后,也是问题相同

hoopslb avatar Jun 22 '18 06:06 hoopslb

红米5,相同问题,请大神赐教。

zpxshl avatar Jul 13 '18 06:07 zpxshl

@DevXue 请问 StatusBarUtil如何隐藏导航栏,没有找到相应的方法,求指点

wxjer avatar Jul 17 '18 11:07 wxjer

小米6x,小米8 ,vivoZ1 也都出现这个问题,用这个demo也是相同问题

xmlxin avatar Aug 01 '18 01:08 xmlxin