java getheight_Java-视图的getWidth()和getHeight()返回0

小编典典

基本问题是,你必须等待绘图阶段进行实际测量(尤其是使用诸如wrap_content或的动态值match_parent),但通常该阶段尚未完成onResume()。因此,你需要一种解决方案来等待此阶段。有一个不同的解决方案:

1.收听绘图/布局事件:ViewTreeObserver

一个ViewTreeObserver被激发用于不同的绘图事件。通常,这OnGlobalLayoutListener是你想要获得测量值的,因此,在布局阶段之后将调用侦听器中的代码,因此测量值已准备就绪:

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

view.getViewTreeObserver().removeOnGlobalLayoutListener(this);

view.getHeight(); //height is ready

}

});

注意:监听器将被立即删除,因为否则它将在每个布局事件上触发。如果必须支持应用程序SDK Lvl <16,请使用以下方法取消注册监听器:

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)

2.将可运行对象添加到布局队列:View.post()

不是很出名,也是我最喜欢的解决方案。基本上,只需将View的post方法与你自己的runnable一起使用即可。如Romain Guy所述,这基本上是在视图的尺寸,布局等之后将你的代码排队:

UI事件队列将按顺序处理事件。调用setContentView()后,事件队列将包含一条消息,要求进行重新布局,因此你发布到队列中的所有内容都会在布局通过后发生

例:

final View view=//smth;

...

view.post(new Runnable() {

@Override

public void run() {

view.getHeight(); //height is ready

}

});

相对于ViewTreeObserver:

你的代码只执行一次,而不必在执行后禁用观察器,这可能会很麻烦

不太冗长的语法

参考文献:

3.覆盖Views的onLayout方法

仅在可以将逻辑封装在视图本身中的情况下,这才是切实可行的,否则,这是一种非常冗长且繁琐的语法。

view = new View(this) {

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

view.getHeight(); //height is ready

}

};

还请记住,onLayout将被调用多次,因此请考虑在方法中执行的操作,或者在第一次后禁用代码

4.检查是否已经过布局阶段

如果你的代码在创建ui时执行了多次,则可以使用以下支持v4 lib方法:

View viewYouNeedHeightFrom = ...

...

if(ViewCompat.isLaidOut(viewYouNeedHeightFrom)) {

viewYouNeedHeightFrom.getHeight();

}

如果视图自上次附加到窗口或从窗口分离以来已经经过至少一种布局,则返回true。

附加:获取静态定义的测量

如果只需要获取静态定义的高度/宽度,你可以使用以下方法执行此操作:

但是请注意,这可能与绘制后的实际宽度/高度不同。javadoc完美描述了差异:

视图的大小用宽度和高度表示。一个视图实际上具有两对宽度和高度值。

第一对称为测量的宽度和测量的高度。这些尺寸定义视图在其父级中的大小(有关更多详细信息,请参见布局。)可以通过调用getMeasuredWidth()和getMeasuredHeight()获得测量的尺寸。

第二对简称为宽度和高度,有时也称为图纸宽度和图纸高度。这些尺寸定义了屏幕上,绘制时和布局后视图的实际尺寸。这些值可以但不必与测量的宽度和高度不同。宽度和高度可以通过调用getWidth()和getHeight()获得。

2020-02-25

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值