【问题标题】: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_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/diabetes_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                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_width="wrap_content"
                android:layout_height="wrap_content"/>

        </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

标签: android view kotlin android-constraintlayout


【解决方案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"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多