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

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

资料⬅专栏获取

相关推荐
程序喵大人27 分钟前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象
程序员黑豆4 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
牛哇网络工作室6 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
hsjiasb7 小时前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
一笑的小酒馆7 小时前
Androidiot蓝牙配网简单封装
android
丰锋ff7 小时前
3.1 Qt事件之事件处理器
开发语言·qt
多弗朗皮卡丘7 小时前
C语言梦开始的地方7:函数
c语言·开发语言
mldong8 小时前
"applicant" 契约:退回发起人的闭环设计
java·架构
月华路8 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
gugucoding8 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言