Android onMeasure()宽度值高于预期

时间:2012-10-03 02:09:48

标签: android measurement

我很难理解我的onMeasure有什么问题。我期望2x2网格具有以下布局,但是当我检查宽度和高度时,高度按预期计算,但宽度为Integer.MAX_VALUE。我无法弄清楚未发生宽度的高度发生了什么。任何帮助我找出正确的onMeasure()方法来获得预期的2x2网格的帮助将不胜感激。虽然示例是2x2网格,但我需要一个适用于任何大小网格的解决方案。

以下是XML。请注意,DragLayer只是扩展了FrameLayout。我不相信自定义标签会导致任何格式差异,但我留下它们以防万一。

<?xml version="1.0" encoding="utf-8"?>
<com.hogenson.dragndrop.DragLayer 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res/com.hogenson.dragndrop"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    custom:sfen="@string/start_sfen" >

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.hogenson.dragndrop.DragView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                custom:border_color="#000000"
                custom:anti_alias="true"
                custom:game_token="r" />

            <com.hogenson.dragndrop.DragView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                custom:border_color="#000000"
                custom:anti_alias="true"
                custom:game_token="p" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.hogenson.dragndrop.DragView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                custom:border_color="#000000"
                custom:anti_alias="true"
                custom:game_token="K" />

            <com.hogenson.dragndrop.DragView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                custom:border_color="#000000"
                custom:anti_alias="true"
                custom:game_token="R" />

        </TableRow>

    </TableLayout>

</com.hogenson.dragndrop.DragLayer>

这是我试图在DragView类中实现的onMeasure()方法。

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

    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);

    if (widthMode != MeasureSpec.EXACTLY)
    {
        width = Integer.MAX_VALUE;
    }

    if (heightMode != MeasureSpec.EXACTLY)
    {
        height = Integer.MAX_VALUE;
    }

    this.setMeasuredDimension(width, height);
}

编辑:

Eric提供的解决方案对我来说非常有效,我还需要将layout_weight添加到水平布局中,这似乎是糟糕的编程习惯。

1 个答案:

答案 0 :(得分:1)

挑剔

在您的if语句中,您是否正在修改width

if (widthMode != MeasureSpec.EXACTLY)
{
    width = Integer.MAX_VALUE;
}

if (heightMode != MeasureSpec.EXACTLY)
{
    width = Integer.MAX_VALUE; // Shouldn't this be height?
}

除此之外......

在我开始使用我的首选解决方案之前,我首先建议您将android:stretchColumns="*"附加到TableLayout。这将允许列填充分配的空间(而不是太小)。

改为使用LinearLayouts

但是,我认为你想要完成的事情最好用LinearLayout来完成。基本上,这个:

<LinearLayout
    ...
    android:orientation="vertical" >

    <LinearLayout
        ...
        android:orientation="horizontal" >

        <com.hogenson.dragndrop.DragView
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <!-- more cells for row 1 -->

    </LinearLayout>

    <LinearLayout
        ...
        android:orientation="horizontal" >

        <com.hogenson.dragndrop.DragView
            android:layout_width="0px"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <!-- more cells for row 2 -->

    </LinearLayout>

</LinearLayout>

最后,正方形

最后,如果您希望对象是方形(宽度和高度相同),请查看this answer

请注意,使用上述解决方案,在这种情况下,您最好不要使用onMeasure; XML应该能够为您处理它。一如既往,祝你好运!