我的应用对每个列表项使用具有以下布局的 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 中使用自定义方块),但我想更好地理解这个问题。
这里发生了什么?