哪个网站可以免费做电子请柬,网站建设团队介绍,如何重新编辑wordpress,济宁培训网站建设转载请标明出处#xff1a;1片枫叶的专栏上1个github小项目中我们介绍了避免按钮重复点击的小框架#xff0c;其实现的核心逻辑是重写OnClickListener的onClick方法#xff0c;添加避免重复点击的逻辑#xff0c;即为第2次点击与第1次点击的时间间隔添加阙值#xff0c;若…转载请标明出处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() {Overridepublic void onClick(View v) {getTextHeightAndWidth();}});这样敲完代码以后我们履行这段代码界面入下图所示那末我们的打印结果呢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方法*/Overridepublic 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() {Overridepublic 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() {Overridepublic 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项目至githubgithub项目解析(2)–将Android项目发布至JCenter代码库github项目解析(3)–android内存泄漏监测之leakcanarygithub项目解析(4)–动态更改TextView的字体大小github项目解析(5)–android日志框架github项目解析(6)–自定义实现ButterKnife框架github项目解析(7)–避免按钮重复点击