0

我很难理解我的 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 添加到水平布局,这似乎是不好的编程习惯。

4

1 回答 1

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
    ...
    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>

最后,正方形

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

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

于 2012-10-03T02:13:19.777 回答