Andorid自定义视图“ onMeasure”未设置所需的宽度和高度

时间:2018-09-02 15:58:10

标签: android android-custom-view

我创建了一个InnerCustomView,尽管我覆盖了onMeasure,但视图高度未设置为所需的高度。

这里是一些上下文。

我有一个CustomView。该视图有一个容器(RelativeLayout),在这里,我有4个InnerCustomViews以及需要放置在容器中的两个准则。为简单起见,我在这里只显示其中一个InnerCustomViews,因为我无法将此视图设置为我的宽度和高度要求。

这是CustomView布局的相关信息:

    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/grey">

        <ImageView
            android:id="@+id/image"
            ....
             />
        <RelativeLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/red"
            android:layout_below="@+id/image">
            <View
                android:id="@+id/guide"
                android:layout_width="12dp"
                android:layout_height="match_parent"
                android:layout_centerInParent="true"
                android:background="@android:color/holo_green_dark" />
                .......
            <...InnerCustomView
                android:id="..."
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_toEndOf="@id/guide"
                android:background="@color/green"
                ... />
        </RelativeLayout>
    </RelativeLayout>

CustomView中,我正在这样做:

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    //Based on the container size I calculate the InnerCustomView desiredSize
    innerCustomView.measure(MeasureSpec.makeMeasureSpec(desiredSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(desiredSize, MeasureSpec.EXACTLY));
}

InnerCustomView只有一个ImageView和一个TextView

<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:background="@drawable/grey">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

我在InnerCustomView中有这个东西:

    public class InnerCustomView extends LinearLayout {

        //Default constructors and other stuff.

        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            measureChildren(widthMeasureSpec, heightMeasureSpec);
            //Here I'm loging the values in widthMeasureSpec and heightMeasureSpec and I can see that they are the desiredSize

            setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
        }
    }

如果您看下面的图像,除了高度,我的布局是预期的。垂直导轨(深绿色)在正确的位置,InnerCustomView在正确的位置。问题是宽度和高度不是我调用measure时通过的宽度和高度。 宽度占用了可用的空间,高度也占用了整个视图的高度(浅绿色) 另一方面,InnerCustomView内容具有desiredSize(灰色)。

任何想法为什么会这样?

我试图使视图,requestLayout(),forceLayout()无效(),但没有成功。

enter image description here

0 个答案:

没有答案