Android获取控件宽高的几种方式

第一种方式:在需要时获取,如控件点击时再获取

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

getTextWidthAndHeight();

}

});

第二种方式:重写onWindowFocusChanged()方法

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

if (hasFocus) {

getTextWidthHeight();

}

}

需要注意的是,这个方法可能会执行多次,比如锁屏,切到后台等重新进入时都会执行该方法。

第三种方式:添加OnPreDrawListener事件监听

getWindow().getDecorView().getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

@Override

public boolean onPreDraw() {

getTextWidthHeight();

getWindow().getDecorView().getViewTreeObserver().removeOnPr

eDrawListener(this);

return false;

}

});

第四种方式:添加OnGlobalLayoutListener事件监听

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

getTextWidthHeight();

getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);

}

});

第五种方式:post Runnable方式

textView.post(new Runnable() {

@Override

public void run() {

getTextWidthHeight();

}

});

示例

public class GetViewHeightActivity extends AppCompatActivity {

private Button testView;

private TextView tvHeightWidthInfo;

private String info = "";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_get_view_height);

testView = findViewById(R.id.view_test);

tvHeightWidthInfo = findViewById(R.id.tv_height_width_info);

getHeightWidth("Default");

onPreView();

onGlobalLayout();

postRunnable();

//点击按钮的时候再获取

testView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

getHeightWidth("onClick");

}

});

}

/**

  • 获取view宽高

*/

private void getHeightWidth(String tag) {

int height = testView.getHeight();

int width = testView.getWidth();

info += tag + " width:" + width + ", height:" + height + "\n";

tvHeightWidthInfo.setText(info);

}

/**

  • 重写onWindowFocusChanged()方法

  • @param hasFocus 当前页面是否有焦点

*/

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

if (hasFocus) {

getHeightWidth("onWindowFocusChanged");

}

}

/**

  • OnPreDrawListener事件监听

*/

private void onPreView() {

getWindow().getDecorView().getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

@Override

public boolean onPreDraw() {

getHeightWidth("OnPreView");

getWindow().getDecorView().getViewTreeObserver().removeOnPreDrawListener(this);

return false;

}

});

}

/**

  • OnGlobalLayoutListener事件监听

  • 最低支持Api 16

*/

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)

private void onGlobalLayout() {

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

getHeightWidth("OnGlobalLayout");

getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);

}

});

}

/**

  • post Runnable方式

*/

private void postRunnable() {

tvHeightWidthInfo.post(new Runnable() {

@Override

public void run() {

getHeightWidth("PostRunnable");

}

});

}

}

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

}

});

}

}

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

外链图片转存中...(img-qalTX3ja-1719020704197)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

资料⬅专栏获取

相关推荐
断剑zou天涯21 小时前
【算法笔记】窗口内最大值或最小值的更新结构
java·笔记·算法
m***667321 小时前
SQL 实战—递归 SQL:层级结构查询与处理树形数据
java·数据库·sql
Just_Paranoid1 天前
【MQTT】基于 Android 设备接入物联网平台最佳实践
android·mqtt·eclipse·iot·paho·mqtt.fx
鲸沉梦落1 天前
Java中的Stream
java
yihuiComeOn1 天前
[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅
java·后端·spring
p***h6431 天前
JavaScript在Node.js中的异步编程
开发语言·javascript·node.js
散峰而望1 天前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
Porunarufu1 天前
Java·关于List
java·开发语言
靠沿1 天前
Java数据结构初阶——Collection、List的介绍与ArrayList
java·数据结构·list
程序猿小蒜1 天前
基于springboot的的学生干部管理系统开发与设计
java·前端·spring boot·后端·spring