如何以编程方式在约束布局中添加视图?

Posted

技术标签:

【中文标题】如何以编程方式在约束布局中添加视图?【英文标题】:How to programmatically add view in Constraint layout? 【发布时间】:2017-06-02 07:24:39 【问题描述】:

我正在尝试设计以下布局

<android.support.constraint.ConstraintLayout
            android:id="@+id/before_breakfast_option"
            android:layout_
            android:layout_>

            <TextView
                android:id="@+id/diabetes_text"
                android:layout_
                android:layout_
                android:layout_marginLeft="16dp"
                android:layout_marginStart="16dp"
                android:text="water"
                android:textAppearance="@style/TextAppearance.AppCompat.Medium"
                android:textColor="@color/black"
                app:layout_constraintBaseline_toBaselineOf="@+id/toogle_diabeties"
                app:layout_constraintLeft_toLeftOf="parent"/>

            <TextView
                android:textColor="@color/black"
                android:text="almonds"
                app:layout_constraintTop_toTopOf="parent"
                android:id="@+id/toogle_diabeties"
                app:layout_constraintRight_toRightOf="parent"
                android:layout_
                android:layout_/>

        </android.support.constraint.ConstraintLayout>

使用以下代码:

 var textView= TextView(this@DietStepFive)
                    textView.id=100
                    textView.text="water"
                    textView.background=ContextCompat.getDrawable(this@DietStepFive,R.drawable.rectangle_diet)
                    textView.setTextColor(ContextCompat.getColor(this@DietStepFive,R.color.black))

                    var textView1= TextView(this@DietStepFive)
                    textView1.id=101
                    textView1.text="almonds"
                    textView1.background=ContextCompat.getDrawable(this@DietStepFive,R.drawable.rectangle_diet)
                    textView1.setTextColor(ContextCompat.getColor(this@DietStepFive,R.color.black))

                    var constraintset= ConstraintSet()
                    constraintset.clone(before_breakfast_option)

                    //left to left of
                    constraintset.connect(textView.id,ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0)
                    //baseline
                    constraintset.connect(textView.id,ConstraintSet.BASELINE,textView1.id,ConstraintSet.BASELINE,0)
                    //right to right of
                    constraintset.connect(textView1.id,ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0)
                    //top to top of
                    constraintset.connect(textView1.id,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP,0)

                    constraintset.applyTo(before_breakfast_option)

                    before_breakfast_option.addView(textView)
                    before_breakfast_option.addView(textView1)

但是 XML 代码给我的布局有两个 textview 一个是左侧,一个是右侧,但是 kotlin 代码给了我两个 textview 在左侧重叠。为什么?

出了什么问题?有铅吗?

【问题讨论】:

向两个TextView添加布局重力 我已将左侧重力添加到 textview 并将右侧添加到 textview1 但没有任何反应@TerrilThomas layout_gravity 而不仅仅是重力 我无法添加 layout_gravity 属性,因为为此我需要将 textview 包装在宽度为 match_parent 的线性布局中,但我不想那样做。 @TerrilThomas 此外,它解决了这个问题,但一般来说,我想在布局中添加尽可能多的视图,直到没有空间为止。对于那个问题,我无法设置重力。 @TerrilThomas 【参考方案1】:

TextViews 添加到布局中,然后像设置 XML 时那样连接它们。您添加了视图,然后将它们连接起来。

移动

before_breakfast_option.addView(textView)
before_breakfast_option.addView(textView1)

之前

var constraintset= ConstraintSet()

一切都应该正常。

【讨论】:

它没有按预期工作。结果与@Cheticamp 之前的结果相同 @AnkurKhandelwal 你肯定需要采取行动,但这可能不是你唯一的问题。我对 Kotlin 不熟悉,所以如果是 Kotlin 问题,我无能为力。我想知道before_breakfast_option 指的是什么,你是否真的应用了你的约束。这是quick gist 的 Java 工作代码,您可以查看。它可能会帮助您找出剩余的问题。 @AnkurKhandelwal 我将上述要点转换为 Kotlin 并成功运行结果。这是工作 Java 代码的Kotlin version。我希望这会有所帮助。 我没有时间检查您的代码(感谢您提出要点和您的好意),但我得到了解决方案。实际上,我使用了错误的约束,是的 addview 会在设置约束之前调用。谢谢你。【参考方案2】:

也许其他人将来会使用它。睡个好觉,工作完成。 我使用了错误的约束。

不是这个

//left to left of
constraintset.connect(textView.id,ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0)
//baseline
constraintset.connect(textView.id,ConstraintSet.BASELINE,textView1.id,ConstraintSet.BASELINE,0)
//right to right of
constraintset.connect(textView1.id,ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0)
//top to top of
constraintset.connect(textView1.id,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP,0)

使用这个

//left to right of
constraintset.connect(textView1.id,ConstraintSet.LEFT,textView.id,ConstraintSet.RIGHT,10)
//baseline
constraintset.connect(textView1.id,ConstraintSet.BASELINE,textView.id,ConstraintSet.BASELINE,0)

【讨论】:

【参考方案3】:

尝试替换app:layout_constraintRight_toRightOf="parent"

app:layout_constraintRight_toRightOf="@+id/toogle_diabeties"

【讨论】:

以上是关于如何以编程方式在约束布局中添加视图?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加控制器视图时自定义自动布局约束被破坏

如何以编程方式使用自动布局添加自定义视图

以编程方式添加约束会破坏自动布局约束

以编程方式将自动布局约束添加到恒定宽度和高度的子视图

堆栈视图内的布局约束(以编程方式快速)

以编程方式修改自动布局约束时视图不更新