无法弄清如何获取视图/布局的宽度/高度

3

我是一个Android新手。这应该是世界上最简单的事情,但弄清楚它让我发疯:如何获取视图或布局的尺寸?

标准方法似乎是这样的:

((LinearLayout)this.findViewById(R.id.MyLayout)).getWidth();

除了这总是返回零,因为我试图在Activity启动时(onCreate)执行此操作,而几何形状还没有设置好。我尝试添加延迟以给它设置布局的机会,但它不会设置布局直到onCreate返回。所以显然它不是线程化的。:P

我找到了一堆页面,谈论覆盖各种不同的回调函数,以确保在调用getWidth时加载布局 - 但当我尝试将覆盖放入我的Activity时,所有这些页面都会引发错误。所以我可以假设它们是测量布局和/或视图的回调。问题在于我没有使用自定义视图/布局类 - 只是标准的视图/布局类。所以据我所知,我不能添加覆盖。

有人知道我该怎么办吗?我已经花了大约8个小时来解决这个问题,却一无所获。在大多数开发环境中,这通常是一个微不足道的事情!

5个回答

22
final View view = .....; // your view

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

      @Override
      public void onGlobalLayout() {
        // make sure it is not called anymore 
        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        // your code to get dimensions of the view here:
        // ...
      }
    });

有趣。但对我来说不起作用。“类型为new ViewTreeObserver.OnGlobalLayoutListener(){}的onGlobalLayout方法必须覆盖超类方法”你有什么想法? - KarenRei
确保导入了所有必要的接口和类。 - plugmind
非常感谢,这对我很有效,我认为它比使用onWindowFocusChanged更好! - Tim Autin
可以了,谢谢。但是 removeGlobalOnLayoutListener 已经被弃用了,我使用了 removeOnGlobalLayoutListener。 - Mete

1

虽然晚了两年,但还是把这个答案放在这里给其他人参考。 尝试重写onWindowFocusChanged方法,在那里你应该能够获取视图的测量宽度/高度。


1

0

onStart()期间如何进行呢?这个方法是在onCreate()执行完毕后调用的,这意味着布局已经被填充。Android生命周期


谢谢!不幸的是,它似乎没有起作用 -- 它仍然返回零。而且这是在xml文件中定义的应用程序主布局上调用的,该布局的宽度和高度都设置为fill_parent。还有其他的假设吗? - KarenRei
作为后续,我加了一个睡眠时间,以便在onStart时看到屏幕的外观。但是,它完全是黑色的,没有任何绘制。我还尝试了onResume,但那里仍然是黑色的。 - KarenRei
还有一个后续:我尝试了另一种技术——在onStart中使用getLayoutParams()。它显示宽度为“-1”。 :P - KarenRei

-1

我有一个解决方法,我使用:

view.postDelayed(new MyRunnable(), 500); 

500毫秒后运行MyRunnable中的逻辑。这样可以让onCreate或其他生命周期方法返回并进行绘制,以便我可以获得正确的高度和宽度。但是这也很丑陋,因为用户可以看到延迟。


为什么要提供这样的解决方案,当你可以找到更好的解决方案呢?! - Hamzeh Soboh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接