首页 > 解决方案 > 如何在 ConstraintLayout 中部分允许 LTR、RTL 支持

问题描述

因此,在我最近的采访中,有人问我,如果在一个ConstraintLayout有多个孩子Views的情况下支持ViewsLTR 和 RTL 更改的一部分以及Views忽略它的一部分,该怎么办。就像下面的图片:

在此处输入图像描述

如您所见,蓝色视图根据视图的布局方向更改其方向,但红色绿色和黄色视图保持相对于彼此的位置,但根据布局方向将它们的(集体)开始和结束对齐到不同的View.

Views我知道您可以简单地使用 start 和 end 属性而不是 left 和 right来设置蓝色。但是您如何保持多色的顺序Views相同但同时将它们与其他重新定位Views?同时确保没有比 parent 更深的层次结构ConstraintLayout

我意识到我在这里可能没有多大意义,我只是想不出另一种方式来表达这个问题。

标签: androidandroid-constraintlayout

解决方案


有趣的问题。我不知道有什么方法可以指定布局的一部分在所有其他部分都变为RTL时应保持LTR。我假设您正在寻找仅 XML 的解决方案。

需要记住的是,从左到左、从右到左的约束仍然有效。通常,这些只会被开始到开始和结束到开始的约束所取代。因此,考虑到这一点并对布局做出一些假设,以下工作:

<androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <View
        android:id="@+id/view"
        android:layout_width="100dp"
        android:layout_height="300dp"
        android:layout_marginStart="24dp"
        android:layout_marginTop="24dp"
        android:background="@android:color/darker_gray"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/view2"
        android:layout_width="239dp"
        android:layout_height="75dp"
        android:layout_marginStart="24dp"
        android:layout_marginTop="24dp"
        android:background="@android:color/holo_blue_bright"
        app:layout_constraintStart_toEndOf="@+id/view"
        app:layout_constraintTop_toTopOf="parent" />

    <View
        android:id="@+id/box1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginTop="24dp"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        android:background="@android:color/holo_orange_light"
        app:layout_constraintRight_toLeftOf="@+id/box2"
        app:layout_constraintLeft_toLeftOf="@+id/view2"
        app:layout_constraintTop_toBottomOf="@+id/view2" />

    <View
        android:id="@+id/box2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="24dp"
        android:background="@android:color/holo_red_light"
        app:layout_constraintRight_toLeftOf="@+id/box3"
        app:layout_constraintLeft_toRightOf="@+id/box1"
        app:layout_constraintTop_toTopOf="@+id/box1" />

    <View
        android:id="@+id/box3"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginLeft="24dp"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        android:background="@android:color/holo_green_light"
        app:layout_constraintRight_toRightOf="@id/view2"
        app:layout_constraintLeft_toRightOf="@+id/box2"
        app:layout_constraintTop_toTopOf="@+id/box2" />

</androidx.constraintlayout.widget.ConstraintLayout>

在此处输入图像描述在此处输入图像描述

有一个技巧:layout_constraintHorizontal_chainStyle必须在水平链中的第一个和最后一个视图上设置。设计者还倾向于将左/右属性更改回开始/结束。

IRL,我只是将块包装在一个视图组中并完成它。我认为它会更容易维护并且不易损坏。


推荐阅读