繁体   English   中英

是否可以有单个 Android ConstraintLayout 可配置的水平或垂直方向?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM