这种类型的行为过于动态,无法在 XML 中定义,但使用自定义容器视图很容易实现。我对您的应用程序做了几个假设,主要是 Activity 的根布局只有两个孩子(ListView
和页脚视图)。基于此,以下是一个自定义LinearLayout
,它将为您提供所需的内容:
public class ComboLinearLayout extends LinearLayout {
public ComboLinearLayout(Context context) {
super(context);
}
public ComboLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//We're cheating a bit here, letting the framework measure us first
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//Impose a maximum height on the first child
View child = getChildAt(0);
int newHeightSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() / 2, MeasureSpec.EXACTLY);
if (child.getMeasuredHeight() > (getMeasuredHeight() / 2)) {
measureChild(child, widthMeasureSpec, newHeightSpec);
}
//Optional, make the second child always half our height
child = getChildAt(1);
measureChild(child, widthMeasureSpec, newHeightSpec);
}
}
然后你可以在你的 Activity 布局中应用它,如下所示:
<com.example.myapplication.ComboLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hi Mom!"
android:background="#0A0"/>
</com.example.myapplication.ComboLinearLayout>
容器代码的最终效果是,ListView
当且仅当它测量到的高度大于容器高度时,它将测量的高度固定为容器高度的一半。否则,它允许ListView
更小。
如果您需要,我添加了一个辅助技巧,它是一个可选的代码块,它强制页脚视图始终为屏幕高度的一半。如果您在 XML 中将页脚视图设置为固定高度,您可能可以从onMeasure()
. 如果您使用该代码,最好将页脚视图设置为match_parent
XML。