0

我的应用对每个列表项使用具有以下布局的 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 是一个自定义 View ,其被覆盖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 之间的不同行为。

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

这里发生了什么?

4

1 回答 1

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));
    }
}
于 2013-09-17T05:23:00.473 回答