Как добавить пользовательское представление (которое расширяется из представления) в блоке создания для 1.0.0-beta01

#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 { /*..*/ }
    }