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)
相关推荐
m0_587383003 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·3 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停4 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金6 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck7 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog7 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
geovindu7 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
Wang's Blog7 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网8 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff8 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈