あなたは、単に(代わりに重量を使用しての)4つの内部の各ビューに一定の高さを提供することができなければ、私は、Javaコードそれに頼ることなく、あなたが欲しいものを行うにはどのような方法があります信じていません。内側ビューの高さを調整します。
最初にスクロールするには、ScrollView
の内容がScrollView
より大きい必要があります。つまり、LinearLayout
でandroid:layout_height="match_parent"
を使用することはできず、スクロールも可能です。
第2に、layout_weight
は、子ビューの間に超過の領域のみを配信します。つまり、この属性は、子ビューの固有次元が親ビューよりも小さい場合にのみ有効です。つまり、LinearLayout
にはandroid:layout_height="wrap_content"
を使用できません。また、高さの加重分布も得られます。
これは、唯一のオプションとして一定の高さを設定します。
あなたが動的子ビューの高さを更新するために、Javaコードを使用して[OK]をしている場合は、ここでそれを行うためのテンプレートです:
レイアウト:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<View
android:id="@+id/one"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#caf"/>
<View
android:id="@+id/two"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#fff"/>
<View
android:id="@+id/three"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#fca"/>
<View
android:id="@+id/four"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#afc"/>
</LinearLayout>
</ScrollView>
のJava:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View scrollingParent = findViewById(R.id.scroll);
scrollingParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int childHeight = scrollingParent.getHeight()/3;
setHeight(R.id.one, childHeight);
setHeight(R.id.two, childHeight);
setHeight(R.id.three, childHeight);
setHeight(R.id.four, childHeight);
}
});
}
private void setHeight(int viewId, int height) {
View v = findViewById(viewId);
ViewGroup.LayoutParams params = v.getLayoutParams();
params.height = height;
v.setLayoutParams(params);
}
ViewTreeObserver.OnGlobalLayoutListener
クラスおよび関連するaddOnGlobalLayoutListener()
コールは、に電話すると、スクロール親が実際に測定され、システムによってレイアウトされるまで待って、その高さの実際の値を得ます。次に、それぞれの子ビューのLayoutParams
を必要な高さに更新します。