我很难理解我的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添加到水平布局中,这似乎是糟糕的编程习惯。
答案 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
。这将允许列填充分配的空间(而不是太小)。
但是,我认为你想要完成的事情最好用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应该能够为您处理它。一如既往,祝你好运!