如何以编程方式在约束布局中添加视图?
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】:将TextView
s 添加到布局中,然后像设置 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"
【讨论】:
以上是关于如何以编程方式在约束布局中添加视图?的主要内容,如果未能解决你的问题,请参考以下文章