如何以编程方式将 textview 添加到 ConstraintLayout?

How to add textview to ConstraintLayout programatically?

有类似的问题,但我还没有找到任何涉及基础知识的问题。 我正在制作一个待办事项列表应用程序,我想要它以便在我单击加号按钮时要求用户输入文本并将项目显示在屏幕上。从用户收到文本后,我不确定如何将其放入文本视图中。将该文本视图添加到 constraintlayout(activity_main.xml) 并将其与另一个文本视图 (menutitletext) 对齐,这样它就不会默认为 0,0。我无法添加代码,因为我真的不知道从哪里开始——答案要么是添加图像视图,要么是在 Kotlin 中,要么是在使用相对布局。如果能提供任何帮助,我将不胜感激。

有人问我的设计 - 我想这就是你想要的?

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<View
    android:id="@+id/divider"
    android:layout_width="393dp"
    android:layout_height="2dp"
    android:layout_marginTop="28dp"
    android:background="#000000"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/menuaddbutton" />

<ImageButton
    android:id="@+id/menusettingsbutton"
    android:layout_width="65dp"
    android:layout_height="55dp"
    android:layout_marginStart="11dp"
    android:layout_marginTop="30dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="20dp"
    android:src="@drawable/test1w"
    app:layout_constraintBottom_toTopOf="@+id/divider"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toEndOf="@+id/menutrashbutton"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.235" />

<ImageButton
    android:id="@+id/menutrashbutton"
    android:layout_width="60dp"
    android:layout_height="65dp"
    android:layout_marginStart="12dp"
    android:layout_marginTop="30dp"
    android:layout_marginBottom="20dp"
    app:layout_constraintBottom_toTopOf="@+id/divider"
    app:layout_constraintStart_toEndOf="@+id/menuaddbutton"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0"
    app:srcCompat="@drawable/test1d" />

<ImageButton
    android:id="@+id/menuaddbutton"
    android:layout_width="78dp"
    android:layout_height="59dp"
    android:layout_marginStart="22dp"
    android:layout_marginTop="30dp"
    android:layout_marginEnd="156dp"
    android:layout_marginBottom="20dp"
    android:background="@android:color/background_light"
    app:layout_constraintBottom_toTopOf="@+id/divider"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toEndOf="@+id/menueditbutton"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.6"
    app:srcCompat="@drawable/test1z" />

<ImageButton
    android:id="@+id/menueditbutton"
    android:layout_width="59dp"
    android:layout_height="59dp"
    android:layout_marginStart="80dp"
    android:layout_marginTop="30dp"
    android:layout_marginBottom="20dp"
    android:background="@android:color/background_light"
    android:onClick="edittitle"
    app:layout_constraintBottom_toTopOf="@+id/divider"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0"
    app:srcCompat="@drawable/test1f" />

<TextView
    android:id="@+id/menutitletext"
    android:layout_width="366dp"
    android:layout_height="36dp"
    android:layout_marginStart="12dp"
    android:layout_marginTop="15dp"
    android:gravity="center_horizontal"
    android:text="@string/menutitleempty"
    android:textAppearance="@style/TextAppearance.AppCompat.Large"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/divider" />

 ConstraintLayout parentLayout = (ConstraintLayout)findViewById(R.id.mainConstraint);
    

    TextView tt= new TextView (this);
    // set view id, else getId() returns -1
    childView.setId(View.generateViewId());
    layout.addView(tt, 0);

你可以这样试试

您可以使用与此处相同的概念

它以编程方式向 ConstraintLayout 添加视图,并将它们与编程约束对齐。我相信这就是你需要的。

针对您的情况

set.connect(childView.getId(), ConstraintSet.TOP, parentLayout.getId(), 
ConstraintSet.TOP, 60);

parentLayout.getId() 更改为您添加的最后一个列表项。您可以使用一些实例变量跟踪最后一个视图是什么。

class MainActivity : AppCompatActivity() {

lateinit var parentLayout: ConstraintLayout

var lastView: View? = null
var numberIfViews = 0

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    parentLayout = findViewById<View>(R.id.constraint_layout) as ConstraintLayout
    lastView = parentLayout
}

fun addTextView(text: String) {

    val set = ConstraintSet()

    val childView = TextView(this)
    childView.id = View.generateViewId()
    childView.text = text
    parentLayout.addView(childView, numberIfViews)

    set.clone(parentLayout)
    set.connect(
        childView.id,
        ConstraintSet.TOP,
        lastView!!.id,
        ConstraintSet.TOP,
        60
    )
    set.applyTo(parentLayout)
    numberIfViews++
    lastView = childView
}

}

尚未测试,但应该可以使用