如何将我的自定义视图迁移到Jetpack Compose?



我用传统的方式创建了一个自定义视图:从view类继承子类。

具体来说,我的自定义视图有许多可以在XML布局中分配的自定义属性(以及它们对应的Kotlin属性):

<com.example.MyCustomView
app:myCustomAttr1 = "..."
app:myCustomAttr2 = "..."/>

如何提供一个视图版本的我的组合,以便用户可以在XML中使用它?

除了使用AndroidView类在Jetpack Compose中加载传统的Android视图外,我如何转换我的观点是"正确的"。组成组件?

我应该为我的自定义视图的每个部分提供一个单独的组合吗?例如,一个可组合用于饼,另一个可组合用于图例框?

Android开发人员文档没有提到如何将自定义视图转换为Compose。

假设我已经创建了一个可组合的视图,如下所示:

@Composable fun MyComposable(title: String) {
Text(title)
}

要像使用常规的视图一样使用该可组合视图(能够在XML中指定其属性),我们应该从AbstractComposeView:

创建一个自定义视图子类
// Do not forget these two imports for the delegation (by) to work
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
class MyCustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : AbstractComposeView(context, attrs, defStyle) {
var myProperty by mutableStateOf("A string")
init {
// See the footnote
context.withStyledAttributes(attrs, R.styleable.MyStyleable) {
myProperty = getString(R.styleable.MyStyleable_myAttribute)
}
}
// The important part
@Composable override fun Content() {
MyComposable(title = myProperty)
}
}

我们是这样使用它的就像XML中的普通视图一样:

<my.package.name.MyCustomView
android:id="@+id/myView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:myAttribute="Helloooooooooo!" />

和/或在活动中:

val myCustomView = findViewById<MyCustomView>(R.id.myView)
myCustomView.myProperty = "Woohoo!"

感谢ProAndroidDev提供这篇文章。

脚注

要为视图定义自己的自定义属性,请参阅这篇文章。
同时,确保使用-ktx版本的AndroidX核心库,能够访问有用的Kotlin扩展功能,如Context::withStyledAttributes:

implementation("androidx.core:core-ktx:1.6.0")

相关内容

  • 没有找到相关文章

最新更新