如何在 Kotlin 中以编程方式设置 RelativeLayout 的所有属性?

How set all attributes of RelativeLayout Programmatically in Kotlin?

我在 activity_main.xml 中的 Android 中创建了一个基本布局,最终将成为按钮的自定义视图。这是一个相对视图,三个圆圈相互堆叠,在中心对齐。当用户与圆圈互动时,圆圈会改变大小。

我现在想完全用 Kotlin 代码复制整个东西,因为它将使用数据库中的数据加载。

我想不通。这是清单...

<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <RelativeLayout
        android:id="@+id/myContainer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/button3"
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:layout_centerInParent="true"
            app:srcCompat="@drawable/circle"
            app:tint="#E60505" />

        <ImageView
            android:id="@+id/button2"
            android:layout_width="400dp"
            android:layout_height="400dp"
            android:layout_centerInParent="true"
            app:srcCompat="@drawable/circle"
            app:tint="#FFB700" />

        <ImageView
            android:id="@+id/button1"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:layout_alignParentRight="false"
            android:layout_centerInParent="true"
            app:srcCompat="@drawable/circle" />
    </RelativeLayout>


</androidx.constraintlayout.widget.ConstraintLayout>

然后在 Kotlin 中,我能找到的只有关于宽度和高度的 LayoutParams,但是我在哪里为相对布局设置所有这些东西?

        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"

我想我想做这样的事情:

class MyContainer : RelativeLayout () {

var button1 = MyButtonClass(someArgs)
var button2 = MyButtonClass(someArgs)
var button3 = MyButtonClass(someArgs)

init {
/// can't find out how to do this bit in Kotlin... 
///something like....
this.layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
this.layoutConstraintBottomToBottomOf = PARENT
this.layoutConstraintHorizontalBias = 0.5
///etc...

//then add the circle buttons 
this.addView(button3)
this.addView(button2)
this.addView(button1)
}

}

我是否走在正确的轨道上?任何指针将不胜感激。

编辑:按照第一个答案,我可以设置布局属性,但是当我尝试在代码中重现我的原始清单树时,我的应用程序只是空白。我应用正确了吗?

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

        val appContainer = findViewById<ConstraintLayout>(R.id.appContainer)

        var buttonContainer = ButtonContainer(this.applicationContext)
        appContainer.addView(buttonContainer)
    }
}


class ButtonContainer (context: Context) : RelativeLayout(context) {

var button1 = CustomButton(context)

val buttonLayoutParams by lazy { ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT).apply {
    bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
    startToStart = ConstraintLayout.LayoutParams.PARENT_ID
    topToTop = ConstraintLayout.LayoutParams.PARENT_ID
    endToEnd = ConstraintLayout.LayoutParams.PARENT_ID
    horizontalBias = 0.5F
}
}

override fun onFinishInflate() {
    super.onFinishInflate()
    this.layoutParams = buttonLayoutParams
    this.addView(button1)
}

}


class CustomButton(context: Context) : ImageView(context) {

val layoutParams by lazy { RelativeLayout.LayoutParams(60, 60).apply {
    addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE)
}
}


override fun onFinishInflate() {
    super.onFinishInflate()
    setLayoutParams(layoutParams)
    setBackgroundResource(squibcircle)
}

}

您需要将 LayoutParams 转换为 ConstraintLayout.LayoutParams 才能像下面那样设置这些属性

class ButtonContainer(context: Context) : RelativeLayout(context) {

    var button1 = CustomButton(context)

    val buttonLayoutParams by lazy { ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT).apply {
           bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
           startToStart = ConstraintLayout.LayoutParams.PARENT_ID
           topToTop = ConstraintLayout.LayoutParams.PARENT_ID
           endToEnd = ConstraintLayout.LayoutParams.PARENT_ID
           horizontalBias = 0.5F
        }
    }

    override fun onFinishInflate() {
        this.layoutParams = buttonLayoutParams
        this.addView(button1)
    }
}