【问题标题】:ConstraintLayout does not get constrained to bottom when lower subviwe gets hidden当下部子视图被隐藏时,ConstraintLayout 不会被限制在底部
【发布时间】:2019-02-21 05:17:55
【问题描述】:

我试图使标题尽可能具有描述性。 我有一个ConstraintLayout 和两个LinearLayout 孩子,里面有ScrollViews,因为里面有很多东西。每个孩子的权重为 1。布局对工具栏的顶部、底部、左侧和右侧的父级以及顶部的边距都有约束。所以基本上,这个布局就像一个上下滑动的底部工作表。 两个子视图 (LinearLayouts-s) 都可以“扩展”,在这种情况下,另一个子视图将其可见性更改为 gone

所以当我展开一个布局并隐藏另一个布局时会发生什么,由于某种原因,整个布局的对齐保持在父级的顶部,保留边距,但被切到底部,留下一个空白空间。我希望它移动到屏幕底部就是这种情况。我还添加了app:layout_constraintVertical_bias="1.0",我认为它会处理它。但它不起作用。我会附上图片。

所以我想要实现的是让工作表始终对齐底部。这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?ord_canvas_secondary_color">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar">

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

    </FrameLayout>

    <View
        android:id="@+id/dim_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="0.5"
        android:background="@color/ord_black"
        android:clickable="true"
        android:focusable="true"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar" />

    <FilterSheet
        android:id="@+id/subscriptions_filter"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginStart="@dimen/dim_8x"
        android:layout_marginTop="@dimen/dim_56x"
        android:layout_marginEnd="@dimen/dim_8x"
        android:layout_marginBottom="@dimen/dim_8x"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar"
        app:layout_constraintVertical_bias="1.0" />

</android.support.constraint.ConstraintLayout>

【问题讨论】:

  • app:layout_constraintTop_toBottomOf="@id/toolbar" 删除此行并尝试一次。
  • 是的,非常合乎逻辑。但在这种情况下,工作表超出了工具栏。我忘了提到工作表为每个线性布局插入了滚动视图。我将编辑问题。
  • 还请发布您的完整 xml 文件代码。
  • @Artipatel 发布了完整的 XML。

标签: android android-constraintlayout


【解决方案1】:

这应该可行。请尝试。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?ord_canvas_secondary_color">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar">

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

    </FrameLayout>

    <View
        android:id="@+id/dim_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:alpha="0.5"
        android:background="@color/ord_black"
        android:clickable="true"
        android:focusable="true"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar" />

    <android.support.constraint.ConstraintLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar"
        app:layout_constraintVertical_bias="1.0" >
        <FilterSheet
            android:id="@+id/subscriptions_filter"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginStart="@dimen/dim_8x"
            android:layout_marginTop="@dimen/dim_56x"
            android:layout_marginEnd="@dimen/dim_8x"
            android:layout_marginBottom="@dimen/dim_8x"
            android:visibility="invisible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            />
    </android.support.constraint.ConstraintLayout>


</android.support.constraint.ConstraintLayout>

【讨论】:

    【解决方案2】:

    试试这个

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?ord_canvas_secondary_color">
    
        <include
            android:id="@+id/toolbar"
            layout="@layout/toolbar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <FrameLayout
            android:id="@+id/content"
            android:layout_width="0dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            android:layout_height="0dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar">
    
            <include layout="@layout/merge_screen_container" />
    
        </FrameLayout>
    
        <View
            android:id="@+id/dim_layout"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:alpha="0.5"
            android:background="@color/ord_black"
            android:clickable="true"
            android:focusable="true"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar" />
    
        <FilterSheet
            android:id="@+id/subscriptions_filter"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_marginStart="@dimen/dim_8x"
            android:layout_marginTop="@dimen/dim_56x"
            android:layout_marginEnd="@dimen/dim_8x"
            android:layout_marginBottom="@dimen/dim_8x"
            android:visibility="invisible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/toolbar" />
    
    </android.support.constraint.ConstraintLayout>
    

    【讨论】:

    • 相同的行为。也许我应该为此使用RelativeLayout
    【解决方案3】:

    所以,@Arti Patel 的回答有点奏效,但过滤器视图仍将超出工具栏。我最终使用了 LinearLayout 和 FrameLayout。

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="?ord_canvas_secondary_color"
            android:orientation="vertical">
    
            <include
                android:id="@+id/toolbar"
                layout="@layout/toolbar" />
    
            <include layout="@layout/merge_screen_container" />
    
        </LinearLayout>
    
        <View
            android:id="@+id/dim_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:alpha="0.5"
            android:background="@color/ord_black"
            android:clickable="true"
            android:focusable="true"
            android:visibility="gone" />
    
        <FilterSheet
            android:id="@+id/subscriptions_filter"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:layout_marginStart="@dimen/dim_8x"
            android:layout_marginTop="@dimen/filter_margin_top"
            android:layout_marginEnd="@dimen/dim_8x"
            android:layout_marginBottom="@dimen/dim_8x"
            android:visibility="invisible" />
    
    </FrameLayout>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多