0

我正在使用这里HorizontalListView提供的,并且我正在尝试显示具有固定高度和宽度的自定义视图,如下所示:

public class MyView extends View {

    public MyView(Context context) {
        super(context);

        init();
    }

    private void init() {
        setBackgroundColor((int) (Math.random() * Integer.MAX_VALUE));
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        int h = getHeight(); // shows 255, correct height
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int w = MeasureSpec.makeMeasureSpec(425, MeasureSpec.EXACTLY);
        int h = MeasureSpec.makeMeasureSpec(255, MeasureSpec.EXACTLY);
        super.onMeasure(w, h);
    }

}

MyView以 normal显示时LinearLayout,高度和宽度是完美的。但是,当我在 中显示视图时HorizontalListView,宽度是完美的,但高度不是。看这个截图:

在此处输入图像描述

宽度是 425px,这是正确的,高度只有 160px 而不是 255。

在源代码中HorizontalListView有这个方法:

private void addAndMeasureChild(final View child, int viewPos) {
    LayoutParams params = child.getLayoutParams();
    if(params == null) {
        params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    }

    addViewInLayout(child, viewPos, params, true);
    child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
                MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
}

在这种方法中我应该改变什么,还是有别的东西可以使这个工作?

4

1 回答 1

0

当你这样做时int h = MeasureSpec.makeMeasureSpec(255, MeasureSpec.EXACTLY);,那个 255 值就是一个 PX 值。如果您在 XML 中说高度为 200 DP,则该值将根据设备进行调整。不确定显示的屏幕是 HDPI 还是 XHDPI(我猜是后者),它会成倍增加,因此您的 200 DP 在 HDPI 手机(x1.5)中变为 300 PX。您可以在 XML 中使用 PX 值,也可以在 values.xml 中定义维度DP 值,即 200DP。

偏好是后者。您可以在 XML 中使用该维度值,并在创建视图时从资源中检索该值。这意味着,如果在某个时候你想让它变大,你可以只改变一个值,你就完成了。

编辑

我看到你发现了真正的问题。在任何情况下,您仍然应该使用维度方法,它会使您的代码更清晰,并且适用于任何手机(255 只会在特定组合中看起来正确)。

于 2013-01-03T13:38:45.320 回答