背景
我目前正在研究创建布局的选项,在项目开发期间,我希望可能将UI迁移到Jetpack Compose或发布后,具体取决于库的稳定性/灵活性。
该项目的一部分将使用服务器驱动的UI。然而,有一个扭曲的地方是UI事先不知道,将是动态的(由服务器和数据驱动)。
我在处理业务逻辑和表示层方面没有问题,但是当涉及UI时,我需要根据表示数据和视图模型动态构建UI的要求。
TL;DR
考虑到这一点,是否可能使用Jetpack Compose创建动态布局(不要与动态布局数据混淆)?
作为最简示例,使用传统的View
和ViewGroup
可以轻松实现:
class DynamicViewActivity : AppCompatActivity() {
private lateinit var root : LinearLayout
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
// setup view group container
root = LinearLayout(this)
root.orientation = LinearLayout.VERTICAL
root.layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT)
setContentView(root, LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT))
// some lookup to create a dynamic layout
val children : List<Pair<View, LinearLayout.LayoutParams>> = getChildren(someArgs)
// add child views
children.forEach { (view, params) -> root.addView(view, params) }
}
fun <T : View> addViewToRoot(view: T, params: LinearLayout.LayoutParams) {
root.addView(view, params)
}
fun removeFromRoot(viewTag : String) {
root.findViewWithTag<View>(viewTag)?.let(root::removeView)
}
}
如何使用Jetpack Compose实现相同的功能?
更新
根据@CommonsWare的答案,我在Compose中实现了UI。由于我的实际代码具有非常薄的UI层,所有侦听器和事件都使用单向和双向数据绑定,并且答案中的“未知项”已经在我的项目中得到解决,所以只需轻松切换UI即可。
尽管如此,我很快意识到,像ScrollView和View::tooltipText这样的简单事物在Compose中尚不存在。与xml布局/资源相比,也没有简单的方法基于运行时配置(屏幕方向/屏幕桶大小等)来进行布局。这意味着对我来说,使用数据绑定与所有丰富的View框架和库仍然是更好的解决方案。
期待Compose库的更新,也许将来会看一下。
LinearLayout
替换为Column()
,并将getChildren()
替换为可组合调用。换句话说,在你的示例级别上,要做的事情很少,因为你把所有复杂性都隐藏在getChildren(someArgs)
中。 - CommonsWare