如何将我的自定义视图迁移到 Jetpack Compose?
How to migrate my custom view to Jetpack Compose?
我有一个 custom view 创建的传统方式:从 View subclassing class.
具体来说,我的自定义视图有许多可以在 XML 布局中分配的自定义属性(及其相应的 Kotlin 属性):
<com.example.MyCustomView
app:myCustomAttr1 = "..."
app:myCustomAttr2 = "..."/>
如何提供我的可组合项的 View 版本以便用户可以在 XML 中使用它?
除了使用 AndroidView class 在 Jetpack Compose 中加载常规 Android 视图外,我如何 转换 我认为是“真正的”Compose 组件?
我应该为自定义视图的每个部分提供一个单独的可组合项吗?
例如,馅饼的可组合项,图例框的另一个可组合项?
Android developer documentation 没有提到如何将自定义视图转换为 Compose。
假设我已经像这样创建了我的视图的可组合版本:
@Composable fun MyComposable(title: String) {
Text(title)
}
要像常规 View 一样使用该可组合项(能够在 XML 中指定其属性),我们应该从 [=33 创建一个自定义视图子类=]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!" />
and/or 在 activity:
val myCustomView = findViewById<MyCustomView>(R.id.myView)
myCustomView.myProperty = "Woohoo!"
感谢 ProAndroidDev this article。
脚注
要为您的视图定义您自己的自定义属性,请参阅 this post。
此外,确保使用 -ktx 版本的 AndroidX Core 库,以便能够访问有用的 Kotlin 扩展函数,例如 Context::withStyledAttributes
:
implementation("androidx.core:core-ktx:1.6.0")
我有一个 custom view 创建的传统方式:从 View subclassing class.
具体来说,我的自定义视图有许多可以在 XML 布局中分配的自定义属性(及其相应的 Kotlin 属性):
<com.example.MyCustomView
app:myCustomAttr1 = "..."
app:myCustomAttr2 = "..."/>
如何提供我的可组合项的 View 版本以便用户可以在 XML 中使用它?
除了使用 AndroidView class 在 Jetpack Compose 中加载常规 Android 视图外,我如何 转换 我认为是“真正的”Compose 组件?
我应该为自定义视图的每个部分提供一个单独的可组合项吗? 例如,馅饼的可组合项,图例框的另一个可组合项?
Android developer documentation 没有提到如何将自定义视图转换为 Compose。
假设我已经像这样创建了我的视图的可组合版本:
@Composable fun MyComposable(title: String) {
Text(title)
}
要像常规 View 一样使用该可组合项(能够在 XML 中指定其属性),我们应该从 [=33 创建一个自定义视图子类=]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!" />
and/or 在 activity:
val myCustomView = findViewById<MyCustomView>(R.id.myView)
myCustomView.myProperty = "Woohoo!"
感谢 ProAndroidDev this article。
脚注
要为您的视图定义您自己的自定义属性,请参阅 this post。
此外,确保使用 -ktx 版本的 AndroidX Core 库,以便能够访问有用的 Kotlin 扩展函数,例如 Context::withStyledAttributes
:
implementation("androidx.core:core-ktx:1.6.0")