返回顶部
首页 > 资讯 > 移动开发 >Android :使用ViewTreeObserver进行监听测绘页面
  • 141
分享到

Android :使用ViewTreeObserver进行监听测绘页面

测绘监听Android 2022-06-06 14:06:31 141人浏览 薄情痞子
摘要

前一段时间,项目中有一个页面,如图所示 图片中的最下方的按钮,取消预约,这两个按钮,在正常的页面中是正常显示的,但是会出现头部的ToolBar

前一段时间,项目中有一个页面,如图所示
在这里插入图片描述在这里插入图片描述
图片中的最下方的按钮,取消预约,这两个按钮,在正常的页面中是正常显示的,但是会出现头部的ToolBar会被顶出页面,也就是在弹出输入框的时候,然后测试小伙伴就给我提了bug,没有办法,只好去寻找解决办法;
1.最开始寻找的解决办法,就是在AndroidMnifest,清淡文件中加入
"

android:windowsoftInputMode="adjustPan|stateHidden"

,但是没啥用啊,后来又详细的查看了相对应的其他几个参数,也都挨个试验了,最后失败;只好再次去另寻他法
2.第二个方法就是进行让整个页面进行滑动,NestedScrollView使用相关的,将整个页面除了toolbar,都包裹进去,然后在弹出输入框的时候进行页面的整体调整,最后勉强通过测试,但是展示效果不理想,而且按钮也跟着滑动,明显的不符合自己的需求;
3.实在没有办法了,继续百度,找方法吧;然后就找到了本片文章的主题ViewTreeObserver,
ViewTreeObserver 注册一个观察者来监听视图树,当视图树的布局、视图树的焦点、视图树将要绘制、视图树滚动等发生改变时,ViewTreeObserver都会收到通知,ViewTreeObserver不能被实例化,可以调用View.getViewTreeObserver()来获得。
官方文档的描述ViewTreeObserver是用来监听一些全局变化的。

	在 ViewTreeObserver 中,包含了以下几个接口:
	interface ViewTreeObserver.OnGlobalFocusChangeListener
	interface ViewTreeObserver.OnGlobalLayoutListener
	interface ViewTreeObserver.OnPreDrawListener
	interface ViewTreeObserver.OnScrollChangedListener
	interface ViewTreeObserver.OnTouchModeChangeListener

具体的使用方法

		View decorView = getWindow().getDecorView();
        View contentView = findViewById(Window.ID_ANDROID_CONTENT);
        decorView.getViewTreeObserver().addOnGlobalLayoutListener(getGlobalLayoutListener(decorView, contentView));

在这里开始进行监听的编写,然后实现对应的监听方法,对其中的对应的数据contentView.setPadding,设置好他的偏移量,这样就可以在弹出输入框的时候,不会让我们的toolbar被顶上去,也不会遮挡住我们的EditText,而且按钮也不会被遮盖

private ViewTreeObserver.OnGlobalLayoutListener getGlobalLayoutListener(final View decorView, final View contentView) {
        return () -> {
            Rect r = new Rect();
            decorView.getWindowVisibleDisplayFrame(r);
            int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
            int diff = height - r.bottom;
            if (diff != 0) {
                if (contentView.getPaddingBottom() != diff) {
                   	contentView.setPadding(0, 0, 0, diff);
           		} else {
                  	contentView.setPadding(0, 0, 0, 0);
            }
        };
    }

然后在我以为大功告成的时候,我们的测试小伙伴又提bug了,在小米的刘海屏手机上在这里插入图片描述
这两个按钮,只展示了头部的一丢丢,取消 和预约按钮的字基本都看出出来;这就很烦人,但是没有办法之后继续加判断
这里获取是不是小米的机型判断

		public static boolean isMiui() {
        	String manufacturer = Build.MANUFACTURER;
        	//这个字符串可以自己定义,例如判断华为就填写huawei,魅族就填写meizu
        	return !"xiaomi".equalsIgnoreCase(manufacturer);
        }

然后在ViewTreeObserver之中加上相关的判断,然后大功告成

private ViewTreeObserver.OnGlobalLayoutListener getGlobalLayoutListener(final View decorView, final View contentView) {
        return () -> {
            Rect r = new Rect();
            decorView.getWindowVisibleDisplayFrame(r);
            int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
            int diff = height - r.bottom;
            if (diff != 0) {
                if (contentView.getPaddingBottom() != diff) {
                    if (isMiui()) {
                        contentView.setPadding(0, 0, 0, diff);
                    }else{
                        contentView.setPadding(0, 0, 0, 0);
                    }
                }
            } else {
                if (contentView.getPaddingBottom() != 0) {
                    contentView.setPadding(0, 0, 0, 0);
                }
            }
        };
    }

开始以为ViewTreeObserver,这个看起来肯定很难,毕竟看起来好像很难的样子,但是实际使用时,沉下心,一切问题就有不太大了.


作者:BigFlyRed


--结束END--

本文标题: Android :使用ViewTreeObserver进行监听测绘页面

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

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

猜你喜欢
  • Android :使用ViewTreeObserver进行监听测绘页面
    前一段时间,项目中有一个页面,如图所示 图片中的最下方的按钮,取消预约,这两个按钮,在正常的页面中是正常显示的,但是会出现头部的ToolBar...
    99+
    2022-06-06
    测绘 监听 Android
  • vue状态过度使用什么进行监听
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。状态过渡状态就是数据,它包含了数值、颜色值、属性值等等,所以状态过渡指的就是数据本身的过渡动效。Vue 推荐通过 “数据驱动,响应式更新” 的方式来实现状态过渡。其主要思...
    99+
    2023-05-14
    Vue
  • Android应用中怎么对系统语言进行监听
    这篇文章给大家介绍Android应用中怎么对系统语言进行监听,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、代码中动态设置应用显示语言(手动控制使用values-zh-rCN下字符串)这个方法是通过改变Resourc...
    99+
    2023-05-31
    android roi
  • 使用Jasmine和Karma对AngularJS页面程序进行测试
    AngularJS是继jQuery之后发生在JavaScript上最好的东西。这也是JavaScript开发一直以来想要的方式。Angular主要的优点之一就是它的依赖注入(Dependency Injec...
    99+
    2022-06-04
    进行测试 页面 程序
  • 教你如何使用Zabbix3.4进行Web监测
    导读zabbix提供web监测,可以实现对网站网页的监测,包括响应速度,状态码访问状态等。本次尝试使用web监测检查网页首页,并尝试状态码200,来衡量网页的情况。主机中增加web场景...
    99+
    2023-06-04
  • 使用traceview进行Android性能测试
      一、 TraceView工具简述   Traceview是android平台配备的一个很好的性能分析工具。它可以通过图形界面的方式让我们了解我们要跟踪的程序的性能,并...
    99+
    2022-06-06
    测试 Android
  • Android应用中怎么对网络连接状态进行监听
    这篇文章给大家介绍Android应用中怎么对网络连接状态进行监听,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。思路:网络变化时系统会发出广播。所以我们监听这个广播,利用接口回调通知activity做相应的操作就好了。。...
    99+
    2023-05-31
    android roi
  • 使用golang怎么对文件的变化进行监听
    本篇文章为大家展示了使用golang怎么对文件的变化进行监听,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。package mainimport ("log"&...
    99+
    2023-06-14
  • 怎么在Android中使用Paint进行绘图
    本篇文章给大家分享的是有关怎么在Android中使用Paint进行绘图,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Paint的使用使用Paint之前需要初始化mPaint&n...
    99+
    2023-05-30
    android paint
  • Android中使用Junit进行单元测试
      不管我们在学习还是在开发的时候,都会用到测试,在Android中进行的Junit单元工具测试需要创建一个类去继承于AndroidTestCase类,同时还需要在主配置文...
    99+
    2022-06-06
    单元 junit 单元测试 测试 Android
  • Android中使用JUnit进行自动测试
    假设你正在编写Android服务代码,而且,又要时不时的重构代码,那么,有效的方式是添加自动测试用例。在写过一个简单的sample以后,发现确实很容易,下面我google的...
    99+
    2022-06-06
    自动测试 自动 junit 测试 Android
  • 如何在spring中使用kafka对消费者进行监听
    这期内容当中小编将会给大家带来有关如何在spring中使用kafka对消费者进行监听,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。整合过程 引入spring-kafka的依赖包 <depe...
    99+
    2023-06-06
  • 怎么在Android中利用广播对usb连接状态进行监听
    今天就跟大家聊聊有关怎么在Android中利用广播对usb连接状态进行监听,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现方法如下:package com.lgs.test.tes...
    99+
    2023-05-31
    android roi usb
  • Android应用中怎么对GIF动图进行播放控制与监听
    今天就跟大家聊聊有关Android应用中怎么对GIF动图进行播放控制与监听,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android 中 GIF 动图处理与监听刚开始第一个想到的便...
    99+
    2023-05-31
    android gif roi
  • 使用Junit对Android应用进行单元测试
      在本文中,你将会学习到如何在Eclipse中创建Android JUnit的单元测试工程以及在不同的条件下创建及运行自动测试用例。   准备工作   本文假设读...
    99+
    2022-06-06
    单元 junit 单元测试 测试 Android
  • android使用OkHttp实现下载的进度监听和断点续传
    1. 导入依赖包 // retrofit, 基于Okhttp,考虑到项目中经常会用到retrofit,就导入这个了。 compile 'com.squareup.retr...
    99+
    2022-06-06
    okhttp 监听 断点续传 断点 Android
  • Android下如何使用JUnit进行软件测试
      软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的。本文将介绍在android下利用ecli...
    99+
    2022-06-06
    junit 软件测试 测试 软件 Android
  • Android中如何使用JUnit进行单元测试
      在我们日常开发android app的时候,需要不断地进行测试,所以使用JUnit测试框架显得格外重要,学会JUnit可以加快应用的开发周期。   Android中建...
    99+
    2022-06-06
    单元 junit 单元测试 测试 Android
  • 怎么使用DIV标签进行页面布局
    这篇文章主要讲解了“怎么使用DIV标签进行页面布局”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用DIV标签进行页面布局”吧!DreamWeaver插...
    99+
    2024-04-02
  • Android如何使用GestureDetector进行手势检测详解
    目录1.引言2.进行手势检测2.1 创建GestureDetector2.2 与onTouchEvent结合使用2.3 GestureDetector.OnGestureListen...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作