免责声明:我无法在所有设备上重现此信息。我能够在运行4.2.1和Galaxy Tab A的Galaxy Nexus上重现它。但它并不是在运行7.0的Nexus 6上发生的。
以下是解释情况的最低范例:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#ff0000"
android:minHeight="500dp">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" />
</FrameLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="some large text here aaaaaaaaaaaaaaaaaaaaaaaaaaa"
android:textSize="100sp" />
</LinearLayout>
</ScrollView>
这是一个简单的布局,我希望我的父FrameLayout
占用TextView
留下的所有空间(这就是我android:layout_weight="1"
的原因)。如果TextView
的空格小于FrameLayout
&#39; minHeight
,则内容可滚动,而FrameLayout
会粘贴到minHeight
。
在内容不可滚动的情况下,一切正常,但如果FrameLayout
到达其minHeight
并且内容变得可滚动,则子FrameLayout
会因为其高度变为零而消失某种原因。
如果您查看Android Studio预览,您将始终能够看到孩子FrameLayout
,但是当您运行它时(在某些设备上),您只会看到父亲&{ #39; s background。
最简单的解决方案是向孩子minHeight
添加相同的FrameLayout
,但就我而言,这不是一个很好的解决方案(我的孩子实际上是一个包含其他子视图的自定义视图)。
另一个解决方案是在运行时强制子高度:
private void ensureChildHeight() {
parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override public void onGlobalLayout() {
if (parent.getHeight() > 0) {
parent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (parent.getHeight() == parent.getMinimumHeight()) {
child.getLayoutParams().height = parent.getMinimumHeight();
child.requestLayout();
}
}
}
});
}
但那也不是很好。有谁知道发生了什么,以及是否有更好的解决方案?经过一段时间的工作和我同事的反馈,我觉得minHeight
不可靠,我应该尽可能地避免它。