如何缩小ScrollView的高度,保持其他视图(Button)固定到位?

时间:2017-07-05 05:28:34

标签: android android-layout scrollview

我在垂直方向上并排ScrollViewButton ConstraintLayout加权链的两个子项,权重1和0分别为{{ 1}}和ScrollView。顺便说一句,您可以选择将它们视为Button而不是LinearLayout的子项,因为加权ConstraintLayout链的工作方式几乎相同一个ConstraintLayout )。

这是使用某些项目(子项)列表创建LinearLayout的典型用例之一,底部有一个大按钮,可根据{{中填充的值搜索数据库1}}孩子们。如下所示:

enter image description here

红色环绕部分是Button应该在的位置(它在那里但不可见)。

现在问题。

我希望按钮始终可见,而不管ScrollView,如果这意味着缩小ScollView的高度,那么因为它可以在所有时间后滚动)但由于ScrollView的内容占用了足够的空间来隐藏ScrollView,因此默认情况下它会被隐藏。解决方案(我认为)需要缩小ScrollView的高度,只需缩小Button在下面剩余空间中可见的数量。

请注意,我不希望这种安排最终会让ScrollView覆盖Button的区域。这种情况下Button不需要高度收缩,而是ScrollView在底部漂浮在其上方,隐藏了一些区域。我想强制ScrollView调整为Button。此外,权重分别为1和0也无济于事。

编辑:布局代码。 (ScrollView带有id search_button)

Button

编辑2:正如@marshmallow所提出的,

// include layout =“@ layout / layout_subject_search”

Button

// include layout =“@ layout / layout_qualification_search”

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="8dp"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    >

    <ScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:id="@+id/scrollView2"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintLeft_creator="1"
        app:layout_constraintVertical_weight="1"
        app:layout_constraintBottom_toTopOf="@+id/search_button"
        app:layout_constraintVertical_chainStyle="spread_inside">

        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="4dp"
            android:layout_marginLeft="4dp"
            android:layout_marginRight="4dp"
            android:layout_marginStart="4dp"
            android:layout_marginTop="8dp"
            android:background="@android:drawable/dialog_holo_light_frame"
            android:paddingEnd="8dp"
            android:paddingLeft="8dp"
            android:paddingRight="8dp"
            android:paddingStart="8dp"
            android:paddingTop="8dp">

            <LinearLayout
                android:layout_height="wrap_content"
                android:layout_width="0dp"
                app:layout_constraintTop_toTopOf="parent"
                android:layout_marginTop="8dp"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                app:layout_constraintLeft_toLeftOf="parent"
                android:layout_marginRight="8dp"
                android:layout_marginEnd="8dp"
                android:orientation="vertical"
                app:layout_constraintRight_toRightOf="parent"
                android:id="@+id/frameLayout">

                <include layout="@layout/layout_subject_search" />

            </LinearLayout>


            <View
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:background="?android:attr/listDivider"
                android:layout_marginLeft="8dp"
                app:layout_constraintLeft_toLeftOf="parent"
                android:layout_marginRight="8dp"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/frameLayout"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginTop="8dp"
                android:id="@+id/view" />

            <LinearLayout
                android:layout_height="wrap_content"
                android:layout_width="0dp"
                android:layout_marginTop="8dp"
                android:layout_marginLeft="8dp"
                android:layout_marginStart="8dp"
                app:layout_constraintLeft_toLeftOf="parent"
                android:layout_marginRight="8dp"
                android:layout_marginEnd="8dp"
                android:orientation="vertical"
                app:layout_constraintRight_toRightOf="parent"
                android:id="@+id/frameLayout1"
                app:layout_constraintTop_toBottomOf="@+id/view">

                <include layout="@layout/layout_qualification_search" />

            </LinearLayout>

            <View
                android:layout_width="0dp"
                android:layout_height="2dp"
                android:background="?android:attr/listDivider"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:layout_marginTop="8dp"
                app:layout_constraintTop_toBottomOf="@+id/frameLayout1"
                android:layout_marginLeft="8dp"
                android:layout_marginRight="8dp"
                android:layout_marginStart="8dp"
                android:layout_marginEnd="8dp"
                android:id="@+id/view2" />


            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/search_by_location_label"
                android:textSize="15sp"
                android:textStyle="bold"
                android:layout_marginLeft="8dp"
                app:layout_constraintLeft_toLeftOf="parent"
                android:layout_marginTop="8dp"
                app:layout_constraintTop_toBottomOf="@+id/view2"
                android:layout_marginStart="8dp" />

            <Switch
                android:id="@+id/location_toggle_switch"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:text=""
                android:layout_marginTop="16dp"
                app:layout_constraintTop_toBottomOf="@+id/view2"
                android:layout_marginRight="16dp"
                app:layout_constraintRight_toRightOf="parent"
                android:layout_marginEnd="16dp" />

            <FrameLayout
                android:id="@+id/map_search_fragment"
                android:layout_width="0dp"
                android:layout_height="240dp"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_below="@+id/textView"
                android:layout_marginBottom="8dp"
                android:layout_marginEnd="8dp"
                android:layout_marginLeft="8dp"
                android:layout_marginRight="8dp"
                android:layout_marginStart="8dp"
                android:layout_marginTop="8dp"
                android:background="@android:drawable/dialog_holo_light_frame"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/location_toggle_switch"
                app:layout_constraintVertical_bias="0.0">

            </FrameLayout>

        </android.support.constraint.ConstraintLayout>

    </ScrollView>

    <Button
        android:id="@+id/search_button"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="@string/search_tutors_string"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="4dp"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintVertical_weight="0"
        app:layout_constraintTop_toBottomOf="@+id/scrollView2" />

    <ProgressBar
        android:id="@+id/search_tutors_progress_bar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:visibility="gone"/>


</android.support.constraint.ConstraintLayout>

2 个答案:

答案 0 :(得分:0)

ScrollView身高改为wrap_content

<ScrollView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    android:id="@+id/scrollView2"
    ...>
</ScrollView>

在ScrollView中将constraintVertical_bias更改为0.0

app:layout_constraintVertical_bias="0.0"

<强>更新

将高度更改为Buttonwrap_content,它将正确显示。

答案 1 :(得分:0)

首先,感谢@marshmallow建议wrap_content策略以及反复测试和回复更新的解决方案。

解决方案对他的建议有点扭曲:

  • layout_height的{​​{1}}为Button。为什么?我们希望声明按钮的高度作为wrap_content调整其大小的参考,并使用ScrollView获取按钮的真实高度。
  • 现在,我们想告诉wrap_content根据按钮调整其大小。为此,我们使用ScrollView作为layout_height转换为“使用可用约束来调整您的大小,而不是断言您自己的任何固定大小”。出于同样的原因,0dp的高度不是0dp。
  • 接下来,我们在两者之间建立加权链关系,权重为Button,0为ScrollView(因为宽度不是0dp /匹配约束,因此对Button无效);所以只需指向Button以占用ScrollView以外的空间

有了这个,最终的解决方案就变成:(针对纵向和横向模式测试的解决方案

Button