在显式调用setLayoutParams之后,未设置OnMeasure的heightMeasureSpec

时间:2015-10-08 17:57:28

标签: android android-layout

我有一个自定义视图,我正在为ListView充气,我正在尝试设置它的确切宽度和高度。但是,尽管在更新的API上工作,它仍然在API 17: 4.2.2失败。这是我的适配器getView()

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    convertView = getInflater().inflate(R.layout.list_view_layout, parent, false);
    CustomImageView image = (CustomImageView) convertView.findViewById(R.id.list_view_image);
    image.setLayoutParams(new LinearLayout.LayoutParams(300, 200));

    return convertView;
}

这是视图的onMeasure()

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);

    if (widthMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.EXACTLY) {
        setMeasuredDimension(widthSize, heightSize);
    }
    else {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

使用调试器,我可以看到widthMeasureSpec是正确的(宽度正确,MeasureSpec.EXACTLY已设置。)在较新的API级别上,heightMeasureSpec也是正确的。 但是,我最近尝试API 17,发现传递的heightMeasureSpec值为0(相当于MeasureSpec.UNSPECIFIED)。

是否有任何见解为什么这不适用于API 17

4 个答案:

答案 0 :(得分:0)

似乎在这个api的视图中已经做了一些改变,我也遇到了这种stange行为。尝试使用ViewTreeObserver.OnGlobalLayoutListener

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        view.getX();
        view.getY();
    }
});

答案 1 :(得分:0)

在onWindowFocusChanged中已经加载了UI元素。 你可以在那里获得数据。

答案 2 :(得分:0)

我不太确定为什么API17单独表现不同(希望可能是一个bug)。但似乎问题可能出在ListView的滚动垂直行为中,因为只有Height受此影响。可能在这种情况下,不考虑指定的高度和" wrap_content"被选中。

但是我希望你现在有一个解决方法。如果没有,那么你可以继续处理MeasureSpec.UNSPECIFIED中的onMeasure()案例。

在我的自定义视图中,我始终确保处理所有案例:已发布完全 AT_MOST

答案 3 :(得分:0)

我没有弄清楚意外行为的原因,但我做了一个hacky work-around。

适配器:

Accept-Ranges: bytes

@Override public View getView(int position, View convertView, ViewGroup parent) { convertView = getInflater().inflate(R.layout.list_view_layout, parent, false); CustomImageView image = (CustomImageView) convertView.findViewById(R.id.list_view_image); image.setDimensions(new Point(300, 200)); image.requestLayout(); return convertView; }

CustomImageView