Android 开发问题:View 的 getWidth、getHeight 方法返回的值都为 0

java 复制代码
ImageView ivTest = findViewById(R.id.iv_test);

int width = ivTest.getWidth();
int height = ivTest.getHeight();

Log.i(TAG, "width: " + width);
Log.i(TAG, "height: " + height);
复制代码
# 输出结果

width: 0
height: 0
  • 在 Android 开发中,上述代码中,getWidth、getHeight 方法返回的值都为 0
问题原因
  1. 当一个 Activity 启动时,视图的创建和显示需要经过几个关键阶段:视图创建阶段 -> 测量阶段 -> 布局阶段 -> 绘制阶段

  2. 在 onCreate 或过早的阶段调用这些方法时,视图尚未完成测量和布局流程,因此坐标值尚未计算,默认返回 0

处理策略
  • 使用 View.post 方法,确保视图已完成布局
java 复制代码
ImageView ivTest = findViewById(R.id.iv_test);

ivTest.post(() -> {
    int width = ivTest.getWidth();
    int height = ivTest.getHeight();

    Log.i(TAG, "width: " + width);
    Log.i(TAG, "height: " + height);
});
补充学习
  • 在 onCreate 方法中,任何需要等待测量和布局阶段完成后才能确定的信息都无法获取,例如
  1. 尺寸相关方法:getWidth、getHeight、getMeasuredWidth、getMeasuredHeight
java 复制代码
ImageView ivTest = findViewById(R.id.iv_test);

int width = ivTest.getWidth();
int height = ivTest.getHeight();

int measuredWidth = ivTest.getMeasuredWidth();
int measuredHeight = ivTest.getMeasuredHeight();

Log.i(TAG, "width: " + width);
Log.i(TAG, "height: " + height);

Log.i(TAG, "measuredWidth: " + measuredWidth);
Log.i(TAG, "measuredHeight: " + measuredHeight);
复制代码
# 输出结果

width: 0
height: 0
measuredWidth: 0
measuredHeight: 0
java 复制代码
// 使用 View.post 方法处理后

ImageView ivTest = findViewById(R.id.iv_test);

ivTest.post(() -> {
    int width = ivTest.getWidth();
    int height = ivTest.getHeight();

    int measuredWidth = ivTest.getMeasuredWidth();
    int measuredHeight = ivTest.getMeasuredHeight();

    Log.i(TAG, "width: " + width);
    Log.i(TAG, "height: " + height);

    Log.i(TAG, "measuredWidth: " + measuredWidth);
    Log.i(TAG, "measuredHeight: " + measuredHeight);
});
复制代码
# 输出结果

width: 200
height: 200
measuredWidth: 200
measuredHeight: 200
  1. 相对位置相关方法:getLeft、getRight、getTop、getBottom、getX、getY
java 复制代码
ImageView ivTest = findViewById(R.id.iv_test);

int left = ivTest.getLeft();
int right = ivTest.getRight();
int top = ivTest.getTop();
int bottom = ivTest.getBottom();

float x = ivTest.getX();
float y = ivTest.getY();

Log.i(TAG, "left: " + left);
Log.i(TAG, "right: " + right);
Log.i(TAG, "top: " + top);
Log.i(TAG, "bottom: " + bottom);

Log.i(TAG, "x: " + x);
Log.i(TAG, "y: " + y);
复制代码
# 输出结果

left: 0
right: 0
top: 0
bottom: 0
x: 0.0
y: 0.0
java 复制代码
// 使用 View.post 方法处理后

ImageView ivTest = findViewById(R.id.iv_test);

ivTest.post(() -> {
    int left = ivTest.getLeft();
    int right = ivTest.getRight();
    int top = ivTest.getTop();
    int bottom = ivTest.getBottom();

    float x = ivTest.getX();
    float y = ivTest.getY();

    Log.i(TAG, "left: " + left);
    Log.i(TAG, "right: " + right);
    Log.i(TAG, "top: " + top);
    Log.i(TAG, "bottom: " + bottom);

    Log.i(TAG, "x: " + x);
    Log.i(TAG, "y: " + y);
});
复制代码
# 输出结果

left: 0
right: 200
top: 161
bottom: 361
x: 0.0
y: 161.0
  1. 绝对位置相关方法:getLocationOnScreen、getLocationInWindow、getGlobalVisibleRect
java 复制代码
ImageView ivTest = findViewById(R.id.iv_test);

int[] locationOnScreen = new int[2];
ivTest.getLocationOnScreen(locationOnScreen);

int[] locationInWindow = new int[2];
ivTest.getLocationInWindow(locationInWindow);

Rect rect = new Rect();
ivTest.getGlobalVisibleRect(rect);

Log.i(TAG, "locationOnScreen: " + Arrays.toString(locationOnScreen));
Log.i(TAG, "locationInWindow: " + Arrays.toString(locationInWindow));
Log.i(TAG, "rect: " + rect);
复制代码
# 输出结果

locationOnScreen: [0, 0]
locationInWindow: [0, 0]
rect: Rect(0, 0 - 0, 0)
java 复制代码
// 使用 View.post 方法处理后

ImageView ivTest = findViewById(R.id.iv_test);

ivTest.post(() -> {
    int[] locationOnScreen = new int[2];
    ivTest.getLocationOnScreen(locationOnScreen);

    int[] locationInWindow = new int[2];
    ivTest.getLocationInWindow(locationInWindow);

    Rect rect = new Rect();
    ivTest.getGlobalVisibleRect(rect);

    Log.i(TAG, "locationOnScreen: " + Arrays.toString(locationOnScreen));
    Log.i(TAG, "locationInWindow: " + Arrays.toString(locationInWindow));
    Log.i(TAG, "rect: " + rect);
});
复制代码
# 输出结果

locationOnScreen: [0, 161]
locationInWindow: [0, 161]
rect: Rect(0, 161 - 200, 361)
相关推荐
满怀冰雪1 小时前
第12篇-二分答案法-当答案不好求时如何反向搜索
java·算法
我登哥MVP1 小时前
SpringCloud 核心组件解析:服务网关
java·spring boot·后端·spring·spring cloud·java-ee·maven
lulu12165440781 小时前
OpenAI 如何用开源前端生态为 GPT-5.6 铺路? - 微元算力(weytoken)
java·前端·人工智能·python·gpt·开源·ai编程
北城以北88882 小时前
RocketMQ简介
java·spring boot·后端·rocketmq
折哥的程序人生 · 物流技术专研10 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
一条泥憨鱼10 小时前
【Redis】数据类型和常用命令
java·数据库·redis·后端·缓存
云烟成雨TD10 小时前
Spring AI Alibaba 1.x 系列【78】沙箱(Sandbox)
java·人工智能·spring
程序员二叉10 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
周航宇JoeZhou11 小时前
JB3-9-SpringAI(二)
java·ai·agent·多智能体·调度·智能体·观察