4

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

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

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

...

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

我如何获得尺寸?

4

3 回答 3

1

虽然使用 viewTreeObserver 绝对有效,但我发现可以使用活动视图中的可运行对象可靠地完成对膨胀视图的测量要求。IE

someActivityInstance.getWindow().getDecorView().post(new Runnable() {
    @override
    public void run() {
        // someMeasurements
    }
});
于 2014-02-27T15:31:00.493 回答
0

问题是convertview很可能还没有在手机屏幕上绘制,所以你必须等到它准备好。

您需要使用 ViewTreeObserver 来准确知道何时绘制视图。

查看此答案以获取更多信息: 我何时可以首先测量视图?

于 2012-08-08T16:52:07.957 回答
0

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

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

其中 rootView 可能是比您想要的宽度更高级别的任何 viewGroup。但请注意,此侦听器可能会运行不止一次。

于 2012-08-08T16:53:31.523 回答