[英]Is it possible to have single Android ConstraintLayout configurable Horizontal or Vertical Orientation?
我想用 ConstraintLayout 编写一个可重用的自定义视图,并且只有 1 个布局文件(如果可能)。 我想要一个相当“简单”的垂直或水平排列的 3 个按钮,基于自定义视图上的方法,例如“setVertical()”,默认为水平等。
我显然可以使用不同的布局文件来做到这一点,但我更喜欢更干净的单文件解决方案。
这可能吗?如果可以,怎么做?
这会通过 AttributeSet 完成吗?
正如有人在评论中所说,您不能直接执行此操作。 您必须手动更改 ConstraintLayout 上的约束以更改方向。 这是我设法做到的:
自定义视图 class:
class CustomView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: ConstraintLayout(context, attrs, defStyleAttr) {
var orientation = -1
set(value) {
if (field == value) return
field = value
val constraints = ConstraintSet()
constraints.clone(this)
when (orientation) {
HORIZONTAL -> {
constraints.createHorizontalChainRtl(ConstraintSet.PARENT_ID, ConstraintSet.START, ConstraintSet.PARENT_ID,
ConstraintSet.END, CHAIN_IDS, null, ConstraintSet.CHAIN_SPREAD)
for (id in CHAIN_IDS) {
constraints.centerVertically(id, ConstraintSet.PARENT_ID)
}
}
VERTICAL -> {
constraints.createVerticalChain(ConstraintSet.PARENT_ID, ConstraintSet.TOP, ConstraintSet.PARENT_ID,
ConstraintSet.BOTTOM, CHAIN_IDS, null, ConstraintSet.CHAIN_SPREAD)
for (id in CHAIN_IDS) {
constraints.centerHorizontallyRtl(id, ConstraintSet.PARENT_ID)
}
}
else -> error("Invalid orientation")
}
constraints.applyTo(this)
}
init {
View.inflate(context, R.layout.custom_view, this)
orientation = HORIZONTAL
}
companion object {
const val HORIZONTAL = 0
const val VERTICAL = 1
val CHAIN_IDS = intArrayOf(R.id.btn1, R.id.btn2, R.id.btn3)
}
}
R.layout.custom_view
文件:
<merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
<Button android:id="@+id/btn1" android:layout_width="48dp" android:layout_height="48dp"/>
<Button android:id="@+id/btn2" android:layout_width="48dp" android:layout_height="48dp"/>
<Button android:id="@+id/btn3" android:layout_width="48dp" android:layout_height="48dp"/>
</merge>
这将使用ConstraintSet
创建具有 3 个按钮的水平或垂直展开链。 也就是说,如果您想要的只是三个按钮,您可能只需更改其方向即可使用LinearLayout
获得相同的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.