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行业感兴趣的新人

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

资料⬅专栏获取

相关推荐
sheji5261几秒前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
2301_763472461 分钟前
C++网络编程(Boost.Asio)
开发语言·c++·算法
毕设源码-邱学长2 分钟前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
程序员清洒7 分钟前
Flutter for OpenHarmony:Text — 文本显示与样式控制
开发语言·javascript·flutter
摇滚侠17 分钟前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言
轩情吖28 分钟前
Qt的窗口
开发语言·c++·qt·窗口·工具栏·桌面级开发
€81129 分钟前
Java入门级教程24——Vert.x的学习
java·开发语言·学习·thymeleaf·数据库操作·vert.x的路由处理机制·datadex实战
Mr_star_galaxy38 分钟前
【JAVA】经典图书管理系统的实现
java
hcnaisd239 分钟前
深入理解C++内存模型
开发语言·c++·算法
凯子坚持 c42 分钟前
Qt常用控件指南(8)
开发语言·数据库·qt