Android Scroll加权和> 100%

时间:2017-12-04 20:25:47

标签: android android-layout

在纯XML中,我创建了一个需要滚动的东西列表。我有一个LinearLayout加权和为3,它包含四个项目。 LinearLayout内的所有项目总共占父母身高的133%。

修剪示例:

<LinearLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:weightSum="3">

    <RelativeLayout android:layout_weight="1" />
    <RelativeLayout android:layout_weight="1" />
    <RelativeLayout android:layout_weight="1" />
    <RelativeLayout android:layout_weight="1" />

</LinearLayout>

如何使用ScrollView将最后一项放入视图?简单地将LinearLayout包裹在滚动条中会导致布局失去其高度的所有概念,导致其子项的高度为wrap_content,而不是拉伸。

Before and After ScrollView

1 个答案:

答案 0 :(得分:1)

除非你可以简单地为四个内部视图中的每一个提供一个恒定的高度(而不是使用重量),否则我不相信有任何方法可以做任何你想做的事情而无需借助Java代码调整内部视图的高度。这种信念基于两个概念:

首先,为了滚动,ScrollView的内容必须高于ScrollView本身。这意味着您无法在android:layout_height="match_parent"上使用LinearLayout并且也可以滚动。

其次,layout_weight仅在子视图中分配多余空间。换句话说,此属性仅在子视图&#39;固有尺寸小于父母尺寸。这意味着您无法在android:layout_height="wrap_content"上使用LinearLayout,也可以获得加权的身高分布。

这使得设置恒定高度成为唯一的选择。

如果您可以使用Java代码动态更新子视图的高度,那么这里有一个模板:

<强>布局

<?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>

<强>爪哇:

@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()调用将一直等到系统实际测量并布置滚动父级,以便在调用{{{{{{{{{{{{ 1}}。然后,您只需更新每个子视图的scrollingParent.getHeight()即可获得所需的高度。

enter image description here enter image description here