首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在构图中创建OnCompletionListener

在构图中创建OnCompletionListener
EN

Stack Overflow用户
提问于 2022-10-25 17:39:38
回答 1查看 74关注 0票数 0

我是一个Java/Andriod程序员,对Kotlin和Jetpack的写作很陌生。我正在创建一个简单的声板应用程序与三个按钮,将发挥独特的声音时,按下。一切进展顺利,但我很难为Mediaplayer实例创建OnCompletionListener (这样我就可以释放资源并更改UI上的按钮)。

在我的按钮组合中,我创建了Mediaplayer的实例

代码语言:javascript
复制
`val mediaPlayer:MediaPlayer by remember {
    mutableStateOf(MediaPlayer.create(context,soundID))
}`

它在图像可组合的OnClick中工作得很好:

代码语言:javascript
复制
        Image (
            painter = painterResource(id = (imageID)),
            contentDescription = null,
            contentScale = ContentScale.FillBounds,
            modifier = Modifier
                .size(250.dp)
                .aspectRatio(16f / 9f)
                .clip(RoundedCornerShape(cornerDiameter.dp))
                .border(
                    BorderStroke(4.dp, Color.Yellow),
                    RoundedCornerShape(cornerDiameter.dp)
                )
                .clickable(
                    enabled = true,
                    onClick = {
                        if (isPlaying) {
                            println("STOPPING player")
                            mediaPlayer.pause()
                            isPlaying = false

                        } else {
                            println("starting player")
                            mediaPlayer.start()
                            isPlaying = true
                        }
                    }
                )
             )

当各自的音频完成播放时,我想调用一个例程来清理和更新UI。在创建onCompletionLIstener时,我向它发送MediaPlayer的实例:

代码语言:javascript
复制
   val onCompletionListener = 
    MediaPlayer.OnCompletionListener(trackDone(mediaPlayer))
    mediaPlayer.setOnCompletionListener(onCompletionListener)

它期望函数trackDone是(MediaPlayer!) → Unit,它自动创建该函数:

代码语言:javascript
复制
fun trackDone(mediaPlayer: MediaPlayer): (MediaPlayer) -> Unit {

    if(mediaPlayer != null)
    {
        mediaPlayer!!.stop()
        mediaPlayer!!.release()

    }
}

但是,现在我发现trackDone说"A 'return' expression required in a function with a block body ('{...}')"是错误的。但是我不知道我能提供什么样的回报来满足这个需求。返回mediaPlayer不起作用。

任何帮助都是非常感谢的。我希望我已经提供了足够的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-26 00:57:39

编译器期望trackDone返回接受MediaPlayer而不返回任何内容的lambda。我不确定您想用这个函数签名完成什么任务,但是下面的代码将修复编译错误。

代码语言:javascript
复制
fun trackDone(mediaPlayer: MediaPlayer): (MediaPlayer) -> Unit {

    if(mediaPlayer != null)
    {
        mediaPlayer!!.stop()
        mediaPlayer!!.release()
    }

    return {}
}

我想这并不完全是您的意图,而是您希望从这个函数中获得一些callback

首先,请清理它,您不需要检查nullability,也不需要在代码中呼喊!!,因为函数已经需要一个非空的 MediaPlayer参数。

接下来,只需添加一个额外的函数类型参数,该参数将作为callbacktrackDone中使用。

将它们放在一起,您的trackDone函数应该如下所示

代码语言:javascript
复制
fun trackDone(mediaPlayer: MediaPlayer, onComplete : (MediaPlayer) -> Unit)  {

    // remove unnecessary nullability checking
    mediaPlayer.stop()
    mediaPlayer.release()
    
    
    // on complete callback
    onComplete(mediaPlayer)
}

或者如果您不想返回MediaPlayer实例,

代码语言:javascript
复制
fun trackDone(mediaPlayer: MediaPlayer, onComplete : () -> Unit)  {

    // remove unnecessary nullability checking
    mediaPlayer.stop()
    mediaPlayer.release()
    
    
    // on complete callback
    onComplete()
}

这就是如何使用‘理想’的方式。

代码语言:javascript
复制
fun someFunction() {

    val mediaPlayer: MediaPlayer
    
    ...
    ...
    ...
    
    trackDone(mediaPlayer) { stoppedMediaPlayer ->
        // DONE
    }

    // or

    trackDone(mediaPlayer) {
        // DONE
    }
}

现在,我不知道这是否像您想要实现的"completeListener“回调”工作“,但”修复“肯定会编译。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74198120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档