#android #android-layout #android-jetpack-compose
Вопрос:
Я пытаюсь включить компонент пользовательского представления в раздел создания с помощью функции AndroidView(viewBlock = { customView})
, это работает для предыдущей версии, но теперь для версии 1.0.0-beta01 не работает, и я не могу найти новый способ сделать это.
Вот как выглядит код:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view = inflater.inflate(R.layout.fragment_recipe_lis, container, false)
view.findViewById<ComposeView>(R.id.compose_view).setContent {
Text("This is a compose view inside a layout")
Spacer(modifier = Modifier.padding(10.dp))
CircularProgressIndicator()
Spacer(modifier = Modifier.padding(10.dp))
Text(text = "Neat")
Spacer(modifier = Modifier.padding(10.dp))
val customView = HorizontalDottedProgress(LocalContext.current)
AndroidView(viewBlock = { customView}) // Error here with the function definition
}
return view
}
Может быть, кто-то из вас знает. Спасибо.
Ответ №1:
вы должны передать фабрику вместо экземпляра представления
AndroidView(factory = { HorizontalDottedProgress(it) })
или
AndroidView(::HorizontalDottedProgress)
если вам нужно настроить представление, сделайте это в конечной лямбде
AndroidView(::HorizontalDottedProgress) { customView ->
customView.doSomething()
}
подробнее читайте в документации
Ответ №2:
С 1.0.0-beta02
AndroidView
помощью конструктора требуется factory
параметр:
Создает представление Android, полученное из
factory
.factory
Блок будет вызван ровно один раз для полученияView
подлежащего составлению, и он также гарантированно будет вызван в потоке пользовательского интерфейса.
Пример:
//option 1
val customView = TextView(LocalContext.current).apply { text = "New Text View" }
AndroidView(factory = { customView })
//option 2
AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
//Option 3
var size by remember { mutableStateOf(100) }
AndroidView(::TextView,
Modifier
.background(Color.Blue)) { view ->
view.layoutParams = ViewGroup.LayoutParams(size, size)
view.apply { text = "This is the 3rd TextView" } }
}
В вашем случае вы можете просто использовать один из этих:
val customView = HorizontalDottedProgress(LocalContext.current)
AndroidView(factory = { customView })
AndroidView({ context -> HorizontalDottedProgress(context).apply { /* ... */ } })
AndroidView(::HorizontalDottedProgress) { view ->
view.apply { /*..*/ }
}