【发布时间】:2021-06-21 14:18:36
【问题描述】:
背景
我目前正在研究创建布局的选项,在项目开发期间,我希望可能将 UI 迁移到 Jetpack Compose 或发布后,具体取决于库的稳定性/灵活性。
项目的一部分将使用服务器驱动的 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()替换为对可组合的调用。 IOW,就您的示例而言,几乎没有什么可做的,因为您将所有复杂性都隐藏在getChildren(someArgs)中。 -
我以前从未使用过compose。对于我的用例来说,这可能是一个基本问题。在近一周没有 cmets/answers/upvotes/downvotes 之后,我决定赌一把来打开赏金。我想这可能是冷漠,有限的社区构成曝光或可能是一个问得不好的问题。我会看看你的建议谢谢。
-
“我从来没有用过compose”——归根结底,Compose 就是所有功能。因此,如果有的话,服务器定义的 UI 更容易,因为您不需要处理膨胀布局或处理小部件和容器的时髦组装。使用服务器定义的 UI,您只是碰巧根据从服务器获取的内容调用函数。
-
当然,我知道实际上我正在连接到一个在后台使用 vue.js 的封闭源代码框架。在没有接触过声明性 UI 和 Compose 的情况下,我要问的是,对我而言,关于使用 compose 创建即时 UI 需要什么的逻辑问题。我见过的所有“涉足”的例子都是已知的 UI 提前 - 我必须处理在线/离线以及曲线球。我有一些想法可以根据您的提示创建某种工厂模式,以返回更高阶的函数,这些函数是可以调用的组合,不确定是否可能,但我会试一试
-
“我在问,对我而言,关于使用 compose 创建即时 UI 需要什么的逻辑问题”——您的最终问题(“您如何使用 compose Jetpack Compose?") 与一个与服务器定义的 UI 没有明显关系的代码示例相关联。例如,您可以有一个示例,该示例显示
when基于某些服务器提供的对象分支到不同的 UI 构造路径,这些路径构造视图。然后有人可以向您展示when分支到基于某些服务器提供的对象的不同 UI 构造路径,这些路径称为可组合。
标签: android android-layout android-jetpack-compose