ListView,RelativeLayout和onMeasure之间不兼容

时间:2013-09-17 05:18:48

标签: android android-layout android-listview

我的应用程序使用ListView,每个列表项具有以下布局:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.myapp.Square
        android:layout_width="100dp"
        android:layout_height="100dp"/>
</RelativeLayout>

Square是一个带有被覆盖的onMeasure()的自定义视图,在尺寸设置为match_parent的情况下,允许它在保持正方形的同时填充屏幕的较小尺寸。 ListView中不需要此功能,但它在应用程序的其他位置使用。

@Override
protected void onMeasure(int w, int h) {
    if (getResources().getConfiguration().orientation == 
            Configuration.ORIENTATION_LANDSCAPE) {
        super.onMeasure(h, h);
    } else {
        super.onMeasure(w, w);
    }
}

结果是正方形的尺寸为零,仅在横向上(即,当高度用作宽度时)。在下列情况下,问题就消失了:

  • 使用LinearLayout而不是RelativeLayout
  • 删除onMeasure时,或
  • 删除ListView时(即列表项布局用作整个活动的布局)

正如您所看到的,这是一个非常具体的案例。

我的猜测是问题与被处理的ListView元素的高度不同于宽度有关,因为ListView元素被强制匹配其内容的高度。但是,由于此处明确指定了内容的高度,因此应该没有问题;在任何情况下,这都不能解释LinearLayout和RelativeLayout之间的不同行为。

该问题有直接的解决方法(例如,不对ListViews中的方块使用自定义onMeasure()),但我想更好地理解这个问题。

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

试试这种方式

@Override
protected void onMeasure(int w, int h) {
    if (getResources().getConfiguration().orientation == 
            Configuration.ORIENTATION_LANDSCAPE) {
        super.onMeasure(h, h);
setMeasuredDimension(MeasureSpec.getSize(h), MeasureSpec.getSize(h));
    } else {
        super.onMeasure(w, w);
setMeasuredDimension(MeasureSpec.getSize(w), MeasureSpec.getSize(w));
    }
}