Constraintlayout Vertical Bias 在Android的两个视图中不起作用

Posted

技术标签:

【中文标题】Constraintlayout Vertical Bias 在Android的两个视图中不起作用【英文标题】:Constraintlayout Vertical Bias not working in two views Android 【发布时间】:2021-12-10 11:51:10 【问题描述】:

我正在使用具有垂直偏差的约束布局来填充回收器视图中的视图。我成功地做到了。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/white">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recylerview"
        android:layout_
        android:layout_
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingBottom="10dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0" />

</androidx.constraintlayout.widget.ConstraintLayout>

我的 recyclerview 项目以相反的顺序显示我,因为我想制作聊天应用程序。所以我添加了 reverseLayoutstackFromEnd true。所以它看起来像这样。

如果我的项目是单一的,我的 ui 通过上面的 xml 代码转换成这样的

现在我想在底部添加编辑文本和按钮。它不工作的垂直偏差。有没有人知道如何解决。关于我可以使用什么的任何建议

预期输出

场景 1

场景 2

实际输出

我试过这段代码

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:background="@color/white">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_
        android:layout_
        android:paddingStart=10dp"
        android:paddingEnd="10dp"
        android:paddingBottom="10dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toTopOf="@+id/inputContainer"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/inputContainer"
        android:layout_
        android:layout_
        android:paddingBottom="20dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/crecyclerView">

        <EditText
            android:id="@+id/editTextContainer"
            android:layout_
            android:layout_
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/button"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_
            android:layout_
            android:text="button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/editTextContainer"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

更新

添加@MartinMarconcini 回答后,它修复了我的场景 2。我也想修复为场景1

【问题讨论】:

设置_RecyclerView_高度为0dp @Cheticamp 它不起作用。当项目更多时,倒序的第一个项目显示半切,如果项目在一个中,则保持相反的顺序。 @Cheticamp 你还有什么建议吗? 我所说的将 RecyclerView 保留在 EditTextButton 上方,无论 Button 中有多少项目i>回收站视图。我不能理解你对布局的问题,因为根据我的理解,这对我有用。 @Cheticamp 当我设置为 0dp 时它可以工作,但是我希望我的 recyclerview 填充整个高度并在图像 1 中显示预期的输出。 【参考方案1】:

这个想法是您的 RV 将自行处理自己的物品大小和空间。你不必担心这个。

剩余的空间,将被 ConstraintLayout 使用。

因此,您需要将 RV 和“底部容器”固定在一起。这默认情况下会导致 CL 尝试拉动和平衡布局,因此您必须告诉底部容器在底部偏向

在伪 XML 中:

<ConstraintLayout>
   <RecyclerView 
      width=0dp
      height=0dp
      start/end = parent
      TopToTop=parent
      BottomToTopOf=BottomContainer
   > 
   <BottomContainer>
      width=0dp
      height=wrap_content 
      TopToBottomOf=RecyclerView
      BottomToBottomOf=parent
      start/end = parent>
</ConstraintLayout>

现在这还需要一件事,因为 RV 会占用所有空间,所以您要确保 BottomContainer 有更多关于它想要放置的位置的信息。

所以你添加:

app:layout_constraintVertical_bias="1.0"

到底部容器。

这意味着,在垂直方向上,尽可能“底部”。 (0.0 则相反)。

最终结果是:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recylerview"
        android:layout_
        android:layout_
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        android:paddingBottom="10dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@android:layout/simple_list_item_2" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_
        app:layout_constraintVertical_bias="1.0"
        android:layout_
        android:id="@+id/bottomContainer"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@id/recylerview"
        app:layout_constraintBottom_toBottomOf="parent">

        <EditText
            android:id="@+id/editTextContainer"
            android:layout_
            android:layout_
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/button"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:id="@+id/button"
            android:layout_
            android:layout_
            android:text="button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/editTextContainer"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

看起来像这样:

更新

如果你同时添加两个

  app:stackFromEnd="true"
  app:reverseLayout="true"

它的工作方式相同,除了项目“0”在底部,“最后”项目在顶部。添加另一个项目会将其添加到顶部,但 BottomContainer 对此没有参与(或影响):

【讨论】:

很好的答案,它适用于我的场景 2。您能否在场景 1 中提供帮助,您可以在 Expected output 中看到图像 你是说当你有“1”个项目时这不起作用?在屏幕截图中,您可以看到 RV 下方有空间可以添加更多项目。无论您拥有多少物品,RV 都会“使用”所有空间,并留出足够的空间让 底部容器 固定在底部。 是的,它不起作用,因为我的 reyclerview 具有 reverselayoutstackFromEnd 为真。它添加元素。我将在几分钟内附上图片。现在的样子。 我添加了截图。请看一看。如何解决这个问题 知道了,我得到了你的答案。感谢一百万@MartinMarconcini

以上是关于Constraintlayout Vertical Bias 在Android的两个视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

android.view.InflateException:膨胀类 androidx.constraintlayout.widget.ConstraintLayout 时出错

ConstraintLayout系列:ConstraintLayout实现局部垂直居中

ConstraintLayout系列:ConstraintLayout实现左右均分布局

Android ConstraintLayout的基本使用

Android ConstraintLayout使用指南

ConstraintLayout