android 如何使用XML设置AbstractComposeView的值?

rxztt3cl  于 2023-02-10  发布在  Android
关注(0)|答案(1)|浏览(139)

我有一个用AbstractComposeView Package 的组合视图,要在XML中使用。如何设置这个视图的值。
例如,

    • 可组合和抽象组合视图**
class MyComposeView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
) : AbstractComposeView(context, attrs, defStyleAttr) {

    private var titleText by mutableStateOf("Default text")

    var titleValue: String
        get() = titleText
        set(value) {
            titleText = value
        }

    @Composable
    override fun Content() {
        ListItem(
            text = titleText,
        )
    }
}

@Composable
fun ListItem(
    text: String,
) {
    Row(
        modifier = Modifier,
    ) {
        Text(
            text = text,
        )
    }
}
    • 可扩展标记语言**
<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=".ViewActivity">

    <com.example.android.MyComposeView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
    • 活动**
findViewById<MyComposeView>(R.id.my_view).titleValue = "From Activity"

这给出了预期的结果,但是如何在不对活动进行任何代码更改的情况下实现相同的结果呢?
类似app:titleText的东西?(尝试过这个没有用)。

xghobddn

xghobddn1#

对于常规的自定义视图,您将需要依赖于属性集。
首先在res > values > attrs.xml中创建它类似于:

<resources>
   <declare-styleable name="MyComposeView">
       <attr name="titleText" format="string" />
   </declare-styleable>
</resources>

然后将其应用到MyComposeView类中

init {
    context.theme.obtainStyledAttributes(
            attrs,
            R.styleable.MyComposeView,
            0, 0).apply {

        try {
            titleText = attributes.getString(R.styleable.MyComposeView_ titleText).toString()
        } finally {
            recycle()
        }
    }
}

参考文献:https://developer.android.com/develop/ui/views/layout/custom-views/create-view#customattr
https://developer.android.com/develop/ui/views/layout/custom-views/create-view#applyattr

相关问题