为什么在post()runnable中查看宽度和高度0?

时间:2012-08-08 16:37:41

标签: android view

我正在获取视图的高度和宽度,在getView()方法中膨胀。这是一个网格项目。

通常我在视图上使用post()来获取大小,在它附加到布局之后。但它返回0.

final View convertViewFinal = convertView;
convertView.post(new Runnable() {
    @Override
    public void run() {
        doSomethingWithConvertView(convertViewFinal);
    }
});

...

doSomethingWithConvertView(View v) {v.getWidth(); /*returns 0*/};

如何获得尺寸?

3 个答案:

答案 0 :(得分:1)

虽然使用viewTreeObserver肯定有效,但我发现使用活动视图中的runnable可以可靠地调用对膨胀视图调用测量要求。即。

someActivityInstance.getWindow().getDecorView().post(new Runnable() {
    @override
    public void run() {
        // someMeasurements
    }
});

答案 1 :(得分:0)

事情是转换视图很可能还没有在手机屏幕上绘制,所以你必须等到它准备就绪。

您需要使用ViewTreeObserver,以确切了解视图的绘制时间。

查看此答案以获取更多信息: When Can I First Measure a View?

答案 2 :(得分:0)

您可能正在onCreate或onStart或onResume上调用此方法,这些方法在布局测量之前运行。 但是有很多工作,这是一个很好的选择:

ViewTreeObserver vto = rootView.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                v.getWidth();//already measured...
            }
        });

其中rootView可以是比您想要宽度更高级别的任何viewGroup。 但请注意,此列表器可能会运行多次。