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)
相关推荐
摇滚侠36 分钟前
Java 全栈开发实战教程 课程笔记 34-36
java·笔记
芝士熊爱编程41 分钟前
创建型模式-单例模式
java·单例模式·设计模式
大模型码小白1 小时前
Spring AI 框架实战:Java 后端集成大模型的架构设计与工程落地
java·人工智能·python·spring
峥嵘life1 小时前
Android WiFi连接过程 wpa_supplicant 日志分析
android·开发语言·php
weixin_BYSJ19871 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
栋***t1 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
CHANG_THE_WORLD1 小时前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
xexpertS1 小时前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
zy happy2 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
Android小码家2 小时前
OWASP 移动应用安全之授权(MASTG-DEMO-0090)
android·安全·frida