このタイプの動作は動的すぎて XML で定義できませんが、カスタム コンテナー ビューを使用すると簡単に実現できます。あなたのアプリケーションについていくつかの仮定を立てています。主に、アクティビティのルート レイアウトには 2 つの子 (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);
}
}
次に、これを次のようにアクティビティ レイアウトに適用できます。
<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 でフッター ビューを固定の高さに設定している場合は、おそらく からその 2 番目のセクションを削除できますonMeasure()
。そのコードを使用する場合、フッター ビューがmatch_parent
XML で に設定されている場合に最適に機能します。