html获取此次点击的id,github项目解析(八)--Activity启动过程中获取组件宽高的三种方式...

转载请标明出处:1片枫叶的专栏

上1个github小项目中我们介绍了避免按钮重复点击的小框架,其实现的核心逻辑是重写OnClickListener的onClick方法,添加避免重复点击的逻辑,即为第2次点击与第1次点击的时间间隔添加阙值,若第2次点击的时间间隔与第1次点击的时间间隔小于阙值,则此次点击无效,再次基础上我们又封装了点击组件验证网络Listener,点击组件验证是不是登录Listener等,具体可参考: github项目解析(7)–>避免按钮重复点击

本文中我将介绍1下android中Activity启动时获得组件宽高的3种方式。我们知道,有时候我们需要在Activity启动的时候获得某1组件的宽或是高用于动态的更改UI布局文件,但是这时候候我们直接通过getWidth和getHeight方法获得是有问题的。为何这么说呢?这里我们可以下1个测试的例子来验证1下:

问题:

在Activity的启动流程中通过getWidht和getHeight方法获得组件的宽度和高度

/**

* 在onCreate方法中调用,用于获得TextView的宽度和高度

*/

private void getTextHeightAndWidth() {

// 我们定义的用于获得宽度和高度的组件

titleText = (TextView) findViewById(R.id.text_title);

int height = titleText.getHeight();

int width = titleText.getWidth();

Log.i(TAG, "height:" + height + " " + "width:" + width);

}

这段代码看似是正常没有问题的,但是我们将调用的代码写在onCreate方法的时候,履行这段代码以后,打印的结果:

06-26 20:12:15.356 19453-19453/uuch.com.android_viewheight I/MainActivity: height:0 width:0

咦?为何打印的height和width都是0呢?我们在履行1遍呢?结果还是1样的,两个变量都是0,难道这段代码不能再onCreate方法中调用,那末我们试试在onResume方法中调用呢?

只能说然并卵,打印的结果仍然是:

06-26 20:52:13.986 19453-19453/uuch.com.android_viewheight I/MainActivity: height:0 width:0

好吧,问题已出来了,看模样我们是不能再onCreate方法或是onResume方法中调用该方法获得组件的宽高的,但是这是为何呢?平时我们都是通过这个方法来获得组件的宽高的,并且也没问题啊,比如我们将这个方法的调用逻辑写在按钮的点击事件以内呢?我们再来试试。

/**

* 这里的button1是我们定义的Button组件,并且我们重写了Button的点击事件,在其中调用了获得组件宽高的方法

*/

button1 = (Button) findViewById(R.id.button1);

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

getTextHeightAndWidth();

}

});

这样敲完代码以后,我们履行这段代码,界面入下图所示:

6bd5c7781bb010d519bca7949275636b.png

那末我们的打印结果呢?

06-26 20:57:08.188 22648-22648/uuch.com.android_viewheight I/MainActivity: height:57 width:225

恩?这时候候我们发现其打印出了组件的宽和高,那末为何我们在Activity的onCreate、onResume方法中打印的时候,输出的组件宽高都是为0呢?

缘由:

其实看过我之前写过的

android源码解析之(104)–>Activity启动流程

android源码解析(107)–>Activity布局加载流程

android源码解析(108)–>Activity布局绘制流程

的同学应当对Activity的启动流程和其布局加载绘制流程不陌生,Activity的启动流程和Activity的布局文件加载绘制流程,其实没有相干的关系的,其实两个异步的加载流程,这样我们在Activity的onCreate和onResume方法调用textView.getHeight或是textView.getWidth方法的时候,其组件并没有履行完绘制流程,因此此时获得到的组件的宽高都是默许的0,也就是没法获得组件的宽和高。

但是当我们将获得组件宽高的方法卸载按钮的点击事件的时候,由于此时按钮已显示出来了,所以证明布局文件已加载绘制完成,这时候候点击组件履行组件的获得宽高方法,就可以正常的获得到组件的宽和高了。

这也就是为何我们在onCreate和onResume方法中调用获得组件宽高都是0,而在按钮的点击事件中获得的时候正常的缘由了。

其他解决方案:

那末如果我们想在Activity的onCreate方法或是onReusme方法获得组件的宽高怎样办呢?这里提供了以下的3种方式:

重写Activity的onWindowFocusChanged方法

/**

* 重写Acitivty的onWindowFocusChanged方法

*/

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

/**

* 当hasFocus为true的时候,说明Activity的Window对象已获得焦点,进而Activity界面已加载绘制完成

*/

if (hasFocus) {

int widht = titleText.getWidth();

int height = titleText.getHeight();

Log.i(TAG, "onWindowFocusChanged width:" + widht + " "

+ " height:" + height;

}

}

说明:

这样重写onWindowFocusChanged方法,当获得焦点的时候我们就能够通过getWidth和getHeight方法得到组件的宽和高了。但是这时候候这个方法的逻辑可能会履行屡次,也就是说只要我们的Activity的window对象获得了焦点就会履行该语句,所以我们需要做1些逻辑判断,让它在我们需要打印获得组件宽高的时候在履行。

为组件添加OnGlobalLayoutListener事件监听

/**

* 为Activity的布局文件添加OnGlobalLayoutListener事件监听,当回调到onGlobalLayout方法的时候我们通过getMeasureHeight和getMeasuredWidth方法可以获得到组件的宽和高

*/

private void initOnLayoutListener() {

final ViewTreeObserver viewTreeObserver = this.getWindow().getDecorView().getViewTreeObserver();

viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

Log.i(TAG, "开始履行onGlobalLayout().........");

int height = titleText.getMeasuredHeight();

int width = titleText.getMeasuredWidth();

Log.i(TAG, "height:" + height + " width:" + width);

}

});

}

说明:

需要说明的是这里的onGlobalLayout方法会在Activity的组件履行完onLayout方法以后履行,这里的onLayout方法主要用于计算组件的宽高操作,具体可参考:android源码解析(108)–>Activity布局绘制流程,这样当我们计算完组件的宽高以后再履行获得组件的宽高操作,自然能够获得到组件的宽度和高度。

为组件添加OnPreDrawListener事件监听

/**

* 初始化viewTreeObserver事件监听,重写OnPreDrawListener获得组件高度

*/

private void initOnPreDrawListener() {

final ViewTreeObserver viewTreeObserver = this.getWindow().getDecorView().getViewTreeObserver();

viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

@Override

public boolean onPreDraw() {

Log.i(TAG, "开始履行onPreDraw().........");

int height = titleText.getMeasuredHeight();

int width = titleText.getMeasuredWidth();

Log.i(TAG, "height:" + height + " width:" + width);

return true;

}

});

}

说明:

需要说明的是这里的onPreDraw方法会在Activity的组件履行onDraw方法之前履行,熟习我们Activity组件加载绘制流程的同学应当知道,这里的onDraw方法主要用于履行真实的绘制组件操作,而这时候候我们已计算出来了组件的位置,宽高等操作,这样以后再履行获得组件的宽高操作,自然能够获得到组件的宽度和高度。

其他说明:

需要说明的是如果对Acitivty的布局加载绘制流程比较了解的同学应当知道,界面的显示进程经过了:丈量位置,丈量大小,绘制,3个操作流程。而我们获得组件的宽高就是获得组件的大小,所以我们获得的代码必须要在组件履行完丈量大小以后,而不管是我们添加的onWindowFocusChanged方法,onPreDrawListener监听,已onGlobalLayoutListener监听其实都是在组件完成了丈量大小以后履行了,因此这时候候我们能够正确的获得到组件的宽和高。

总结:

该类库主要是介绍了3种我们在Activity的启动进程中获得组件宽高的方式;

通太重写onWidnowFocusChanged方法获得组件宽高的方式,可能会回调几次,这点需要我们注意;

项目保存地址:android-viewheight,欢迎star和follow

另外对github项目,开源项目解析感兴趣的同学可以参考我的:

github项目解析(1)–>上传android项目至github

github项目解析(2)–>将Android项目发布至JCenter代码库

github项目解析(3)–>android内存泄漏监测之leakcanary

github项目解析(4)–>动态更改TextView的字体大小

github项目解析(5)–>android日志框架

github项目解析(6)–>自定义实现ButterKnife框架

github项目解析(7)–>避免按钮重复点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

minitab怎么算西格玛水平_16:三因子二水平全因子实验设计和MINITAB应用训练

16:思慧慧咨询官网――精益生产、六西格玛黑带、绿带、TRIZ创新发明、实验设计DOE、价值工程、全面设备管理(TPM)培训和项目咨询​www.sihuide.com分享地址:千聊入口1 https://m.qlchat.com/topic/details?topicId20000087131743…

html css position,[CSS]CSS Position 详解

一. CSS position 属性介绍CSS中position属性指定一个元素(静态的,相对的,绝对或固定)的定位方法的类型。有static,relative,absolute和fixed四种取值,默认是static。二. position: staticstatic:没有定位&…

win2008无法用计算机名共享,Windows Server 2008 R2中文件共享

在网上找过很多次相关资料,还是自己整理一下吧。实践了才是自己的,只看永远是别人的。服务器:Server 2008 R2(IP:192.168.1.106);客户端:Server 2008 R2(IP:192.168.1.107)一、 创建用户itjong运…

线性规划图解法求最优解_高中数学:简单的线性规划问题

1. 简单线性规划问题的有关概念先来看一道高考题:某公司招收男职员x名,女职员y名,x和y须满足约束条件,则的最大值是( )A. 80 B. 85 C. 90 D. 95(1)约束条件:变量x、y满足的一组条件,如上面高考题中的二元一…

在桌面关闭计算机关机不了怎么办,为什么我电脑按关机屏幕一直显示正在关机却一直关不了机怎么办...

“开始”-->“运行”-->键入“Regedit”-->“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\control\Shutdown子项,在右边窗口中新建一个"字符串值",命名为"FastReboot",同时将"数值数据"设为0即可。如果还不行再…

spark-sql建表语句限制_SparkSQL

SparkSQL介绍Hive是Shark的前身,Shark是SparkSQL的前身,SparkSQL产生的根本原因是其完全脱离了Hive的限制。SparkSQL支持查询原生的RDD。 RDD是Spark平台的核心概念,是Spark能够高效的处理大数据的各种场景的基础。能够在scala中写SQL语句。支持简单的SQ…

计算机大作业论文意义,大学的大作业是什么?

原标题:大学的大作业是什么?大学里面的大作业一般就是课程设计之类的,一些老师会让学生做些课外实践的作业,作为平时成绩的一部分大作业听起来很高大上,然而好多课程其实只是一篇论文。论文类的就是有点水的了。毕竟学…

arduino智能浇花系统_arduino+水泵+继电器+RFID

arduino继电器电机应用场合:加湿器、自动浇花、智能门锁、报警系统.......总之很多场合都适用。本章就介绍利用RFID卡输入,驱动水泵。/* * ---------------------------------------------------------------------------------------------------------…

7段均衡器最佳调节图_超高级的吉他均衡器 更细腻的控制 你值得拥有

BOSS DD-200吉他均衡器最近 BOSS推出了一款全新的吉他均衡效果器,为了追求更细腻的控制,这一次的更新,EQ200 可以说做出了不少的颠覆性改进。面板上很直观的看到,EQ的推子增加到了10段,外加一个总音量,对于…

京瓷m5021cdn如何设置扫描_京瓷产品让您轻松应对潮湿天气

随着即将到来的四月,中国南方大部分地区也将伴随着雨季的到来。这也意味着很多复印件、打印机将会收到潮湿天气的影响,更容易出现卡纸、图像模糊等一系列问题。而京瓷公司最新推出的“黑金刚”系列增加了特有的感光鼓加热功能,有效减少机器受…

server sql 去 反斜杠_%00截断配合反序列化的奇妙利用

文章来源:安全客原文链接:%00截断配合反序列化的奇妙利用 - 安全客,安全资讯平台前言前段时间做了一个CTF题目,发现这道题目相当的精妙,主要是利用了%00的截断来绕过安全校验,最终利用反序列化达成目的。漏…

刷卡提示57能恢复吗_硬盘格式化之后数据还能恢复吗?

硬盘格式化之后数据还能恢复吗? 移动硬盘是工作生活中常用的一种存储介质,如果在其中存储了重要的数据,但是却因为中了病毒、人为删除或者不小心误删除文件或是格式化等而导致数据丢失该怎么办?移动硬盘数据可以恢复吗?如何进行移…

win7电脑蓝屏没有修复计算机,教你win7开机蓝屏怎么修复

在使用电脑的过程中,经常会遇到一些问题,最常见的莫过于win7开机蓝屏了,很多朋友并不知道win7开机蓝屏怎么修复,那么遇到win7开机蓝屏的情况应该怎么办呢?下面小编针对此问题教程大家开机蓝屏怎么修复。方法一、系统自…

怎么从计算机上删除东西吗,怎么在电脑中删除不想要的软件

在电脑中删除不想要的软件该怎么操作呢,那么怎么在电脑中删除不想要的软件的呢?下面是学习啦小编收集整理的怎么在电脑中删除不想要的软件,希望对大家有帮助~~在电脑中删除不想要的软件的方法工具/原料笔记本电脑 或者台式电脑方法/步骤用鼠标点击选择电…

js输出100以内的质数_Python 计数质数

一个很经典的问题,从 2 到 N ,一共有多少个质数??一个非常 Naive 的方法,从 2 到 N,判断每个数是不是质数只判断一个数是不是质数,需要 的时间,现在有 N 个数,那么就是 埃…

kmeans算法中的sse_聚类算法入门:k-means

一、聚类定义聚类分析(cluster analysis)就是给你一堆杂七杂八的样本数据把它们分成几个组,组内成员有一定的相似,不同组之间成员有一定的差别。区别与分类分析(classification analysis) 你事先并不知道有哪几类、划分每个类别的标准。比如垃圾分类就是…

win7局域网计算机 慢,Win7系统开机宽带连接很慢怎么办?

Win7系统用户在使用电脑系统上网时,都需要对宽度进行连接,但有用户反映在开机时机宽带连接非常缓慢,甚至要等上十来分钟,这使用户非常苦恼,那么Win7系统开机宽带连接很慢应该怎么办呢?接下来下面就来教大家…

小天才被限定使用时长的应用_家庭腕上社交新场景,OPPO Watch、小天才开启暖心联动...

说到小天才手表,相信家长朋友们都或多或少的听说过,或者正在给孩子使用。可爱的造型和实用的功能还有亲民的价格,让小天才手表成为青少年智能穿戴领域的热门产品。特别是对于正在上幼儿园和小学阶段的小朋友来说,支持通话和定位功…

ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

2.4.5 EF Core -- 查询关联数据加载客户端与服务端运算跟踪与不跟踪复杂查询运算原生 SQL 查询全局查询筛选器关联数据加载学员和助教都在项目分组中&#xff0c;调整模型&#xff0c;删除 AssistantProjectGroup 添加 Member 列表public List<Member> Members { get; se…

三国杀服务器改名 插图修改,《三国杀》大幅修改的武将——新旧两版,你更喜欢哪一位...

三国杀中&#xff0c;某些武将因为太强或者太弱&#xff0c;不能适应游戏环境&#xff0c;都会进行修改&#xff0c;例如&#xff1a;李丰、马良、伏皇后、曹冲等等&#xff0c;但这些武将修改之后&#xff0c;原有武将就淘汰了。其实&#xff0c;还有一类武将&#xff0c;技能…