android - 如何在 ConstraintLayout 中部分允许 LTR、RTL 支持
问题描述
因此,在我最近的采访中,有人问我,如果在一个ConstraintLayout
有多个孩子Views
的情况下支持Views
LTR 和 RTL 更改的一部分以及Views
忽略它的一部分,该怎么办。就像下面的图片:
如您所见,蓝色视图根据视图的布局方向更改其方向,但红色绿色和黄色视图保持相对于彼此的位置,但根据布局方向将它们的(集体)开始和结束对齐到不同的View
.
Views
我知道您可以简单地使用 start 和 end 属性而不是 left 和 right来设置蓝色。但是您如何保持多色的顺序Views
相同但同时将它们与其他重新定位Views
?同时确保没有比 parent 更深的层次结构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,我只是将块包装在一个视图组中并完成它。我认为它会更容易维护并且不易损坏。
推荐阅读
- c# - 由于 PropertyGrid,mahapps metro 对话框打开速度慢的可能原因
- multithreading - 使用多线程 JDBC 创建/更新/插入查询的数据库访问问题
- django - 如何使用 from ..media 在 .py 文件中导入媒体目录
- java - 表中的一列被多个物理列名引用
- xamarin.android - 是否可以在 Xamarin.Android 中将文件复制到 USB 驱动器?
- reactjs - 如何在 React Data Grid 中使用反应钩子执行编辑和过滤选项
- r - 创建数据框R时合并两个列表
- sql-server - 检索共享相同(重复)PrescriptionID 但不同 Antibiotic_Prescribed 的行
- types - Ada - 可空类型
- c# - 我通过我的应用程序启动的命令行程序,只显示黑屏