如何将 Click 事件从父 XML 视图传递到 Jetpack Compose 内部

How to Pass Click events from Parent XML view to inside Jetpack Compose

提问人:ahmed 提问时间:11/13/2023 更新时间:11/13/2023 访问量:39

问:

我有一个用 XML 和 Kotlin 制作的现有应用程序。更新时,我想学习 Jetpack Compose,因此我使用 ComposeView 在父 XML 屏幕中添加了一个 HorizontalPager。

在 XML 中

    <androidx.compose.ui.platform.ComposeView
        android:id="@+id/my_composable"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:visibility="visible"
        app:layout_constraintBottom_toTopOf="@+id/divider"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

然后在 Kotlin 我做到了

binding.value.myComposable.setContent {
            IntroPager()
        }

我的撰写功能

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun IntroPager(){
    val pagerState = rememberPagerState(pageCount = {
        3
    })
    
    Box(modifier = Modifier.fillMaxSize()) {

        HorizontalPager(
            state = pagerState,
            modifier = Modifier.fillMaxSize()

        ) { page ->
            when (page){
                0-> Page1("")
                1-> Page2("")
                2-> Page3("")
                else -> Page1(" from else $page")
            }
        }

        Row(
            Modifier
                .wrapContentHeight()
                .fillMaxWidth()
                .align(Alignment.BottomCenter)
                .padding(bottom = 8.dp),
            horizontalArrangement = Arrangement.Center
        ) {
            repeat(pagerState.pageCount) { iteration ->
                val color =
                    if (pagerState.currentPage == iteration) Color(R.color.theme_color_secondary) else Color(R.color.dark_grey)
                Box(
                    modifier = Modifier
                        .padding(2.dp)
                        .clip(CircleShape)
                        .background(color)
                        .size(16.dp)
                )
            }
        }

    }

}

现在,基于屏幕 XML 部分中的一些用户交互,我想从 XML onClickListener 传递一个单击事件,以转到 Compose 中 HorizontalPager 中的下一页。基本上将 XML clickEvent 传递给 Compose。

我找不到任何关于如何实现这一点的文档。

我尝试实现接口回调,但没有成功

人造人 科特林 android-jetpack-compose 安卓喷气背包

评论

0赞 ItzDavi 11/16/2023
为什么不创建一个简单的函数在用户点击时调用?你试过了吗?

答:

0赞 Faruk Karaca 11/13/2023 #1

在开头定义并将其作为参数发送到 。pagerStatesetContentIntroPager

var pagerState = rememberPagerState(pageCount = { 3 })
fun IntroPager(pagerState: PagerState) 

使用它进行页面切换

val scope = rememberCoroutineScope()
scope.launch {
   pagerState.scrollToPage(value)
}

您必须在 之后添加 xml clickListener。否则,您将收到此错误。setContent

@Composable调用只能在上下文中发生 @Composable