首页 > 解决方案 > 如何从 MainActivity.kt 为动态创建的 TextView 设置 constraintTop_toTopOf 属性

问题描述

我正在尝试制作一个非常基本的纸牌游戏。我想动态创建一堆TextViewsMainActivity.kt作为占位符堆叠在另一个 TextView 的确切位置上,这是在activity_main.xml 我需要能够通过更改位置约束将这些对象移动到不同位置时创建的。

我搜索了文档,但找不到如何在运行时以编程方式设置约束。设置 x 和 y 不起作用,因为我正在使用约束。

如何将电视的约束设置为占位符的顶部和边距?就像是:

tv.layoutParams.topToTopOf = "@id/deck_placeholder"
tv.layoutParams.marginLeft = "10dp"

实现下面的 xml 设置

            app:layout_constraintEnd_toEndOf="@id/deck_placeholder"
            app:layout_constraintTop_toTopOf="@id/deck_placeholder"

活动主.xml:

<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/deck_placeholder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:text="DD"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt 类:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var layout = findViewById<ConstraintLayout>(R.id.main_layout)
        val placeholder = findViewById<TextView>(R.id.deck_placeholder)
        for (i in 1..52) {
            var tv = TextView(this)
            tv.text = i.toString()
            tv.id = generateViewId()
            //TODO: how to set constraint and position here
            //tv.layoutParams = placeholder.layoutParams
            layout.addView(tv)
        }
    }
}

结果如下所示。生成的 TextView 应该在 DD 所在的屏幕右侧。

模拟器屏幕左侧

我试图复制占位符的布局参数并且卡片在正确的位置,但是我以后如何通过指定约束和边距将它移动到另一个地方?

模拟器画面右侧

或者是否有更好的布局可以使用,以便我可以放置 X 和 Y 坐标,但仍能响应不同的屏幕尺寸/方向?

将 Android Studio 4.1.3 与 Kotlin 一起使用。感谢您的任何帮助。

标签: androidkotlin

解决方案


推荐阅读