2

我试图展示一个MyCustomLinearLayoutwhich extends LinearLayout。我MyCustomLinearLayoutandroid:layout_height="match_parent"属性夸大了。我想要的是ImageView在这个MyCustomLinearLayout. 这个的高度ImageView应该是match_parent,宽度应该等于高度。我试图通过覆盖该onMeasure()方法来实现这一点。发生的情况是,它MyCustomLinearLayout确实像它应该的那样变成了正方形,但ImageView没有显示出来。

在我使用的代码下方。请注意,这是我的问题的一个极其简化的版本。将ImageView被更复杂的组件取代。

public MyCustomLinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
}

private void init(Context context) {
    final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.view_myimageview, this);

    setBackgroundColor(getResources().getColor(R.color.blue));
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
    setMeasuredDimension(height, height);
}

view_myimageview.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <ImageView
        android:id="@+id/view_myimageview_imageview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher" />

</merge>

因此,当我覆盖该onMeasure()方法时,ImageView不显示,当我不覆盖该onMeasure()方法时,ImageView显示,但是太小了,因为MyCustomLinearLayout' 的宽度太小了。

4

1 回答 1

9

这不是您覆盖该onMeasure方法的方式,尤其是默认 SDK 布局的方法。现在使用您的代码,您刚刚制作了MyCustomLinearLayout正方形,并为其分配了一定的值。但是,你没有测量它的孩子,所以他们是没有大小的,不会出现在屏幕上。

我不确定这是否可行,但试试这个:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int size = getMeasuredHeight();
    super.onMeasure(MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY));
}

当然,这基本上会完成onMeasure两次的工作,但ImageView现在应该可以看到填充它的父级。还有其他解决方案,但您的问题在细节上有点缺乏。

于 2012-11-15T09:53:59.040 回答