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

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

资料⬅专栏获取

相关推荐
菜鸡且互啄6932 分钟前
在线教育平台,easyexcel使用案例
java·开发语言
八月林城32 分钟前
JAVA导出数据库字典到Excel
java·数据库·excel
电饭叔2 小时前
《python程序语言设计》2018版第5章第52题利用turtle绘制sin函数
开发语言·python
weixin_452600692 小时前
如何为老化的汽车铅酸电池充电
开发语言·单片机·安全·汽车·电机·电源模块·充电桩
浅念同学2 小时前
算法-常见数据结构设计
java·数据结构·算法
Java资深爱好者3 小时前
如何在std::map中查找元素
开发语言·c++
YCCX_XFF213 小时前
ImportError: DLL load failed while importing _imaging: 操作系统无法运行 %1
开发语言·python
哥廷根数学学派4 小时前
基于Maximin的异常检测方法(MATLAB)
开发语言·人工智能·深度学习·机器学习
Geeker554 小时前
如何在忘记密码的情况下解锁Android手机?
android·网络·macos·华为·智能手机·电脑·手机
杰哥在此5 小时前
Java面试题:讨论持续集成/持续部署的重要性,并描述如何在项目中实施CI/CD流程
java·开发语言·python·面试·编程