我是Android新手。这应该是世界上最简单的事情,但弄清楚它会让我感到沮丧:如何获得视图或布局的尺寸?
标准方法似乎有以下几点:
((的LinearLayout)this.findViewById(R.id.MyLayout))的getWidth();
除此之外总是返回零,因为我在Activity启动时尝试执行此操作(onCreate)并且尚未设置几何。我尝试进入睡眠状态,让它有机会设置布局,除非不会设置布局,直到onCreate返回。所以它显然没有线程化。 :P
我发现了一堆谈论覆盖各种不同的回调函数,以确保当你打电话的getWidth布局加载页面 - 但是当我试图把覆盖在我的活动他们都扔错误。所以我可以假设它们是被测量的布局和/或视图的回调。问题在于我没有使用自定义视图/布局类 - 只是标准类。所以我不能只是添加一个覆盖,据我所知。
任何人都知道我应该做什么?我已经花了8个小时来解决这个问题并且无处可去。在大多数开发环境中,这通常是一件非常简单的事情!
答案 0 :(得分:21)
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:
// ...
}
});
答案 1 :(得分:1)
为什么不View.getLayoutParams()
?它有public int height
和public int width
。
答案 2 :(得分:1)
迟了两年,但是把它放在别人身上。 尝试覆盖onWindowFocusChanged。您应该能够在那里获得视图的测量宽度/高度。
答案 3 :(得分:0)
在onStart()
期间怎么做?在onCreate()
完成执行后调用此方法,这意味着布局已经膨胀。 android lifecycle
答案 4 :(得分:-1)
我有一个解决方法:
view.postDelayed(new MyRunnable(), 500);
从现在起500毫秒内运行MyRunnable中的逻辑。这允许onCreate或任何生命周期方法返回和绘制,以便我可以获得正确的高度和宽度。但它也很难看,因为用户可以看到延迟。