我是一个Java/Andriod程序员,对Kotlin和Jetpack的写作很陌生。我正在创建一个简单的声板应用程序与三个按钮,将发挥独特的声音时,按下。一切进展顺利,但我很难为Mediaplayer实例创建OnCompletionListener (这样我就可以释放资源并更改UI上的按钮)。
在我的按钮组合中,我创建了Mediaplayer的实例
`val mediaPlayer:MediaPlayer by remember {
mutableStateOf(MediaPlayer.create(context,soundID))
}`
它在图像可组合的OnClick中工作得很好:
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的实例:
val onCompletionListener =
MediaPlayer.OnCompletionListener(trackDone(mediaPlayer))
mediaPlayer.setOnCompletionListener(onCompletionListener)
它期望函数trackDone是(MediaPlayer!) → Unit
,它自动创建该函数:
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不起作用。
任何帮助都是非常感谢的。我希望我已经提供了足够的信息。
发布于 2022-10-26 00:57:39
编译器期望trackDone
返回接受MediaPlayer
而不返回任何内容的lambda
。我不确定您想用这个函数签名完成什么任务,但是下面的代码将修复编译错误。
fun trackDone(mediaPlayer: MediaPlayer): (MediaPlayer) -> Unit {
if(mediaPlayer != null)
{
mediaPlayer!!.stop()
mediaPlayer!!.release()
}
return {}
}
我想这并不完全是您的意图,而是您希望从这个函数中获得一些callback
。
首先,请清理它,您不需要检查nullability
,也不需要在代码中呼喊!!
,因为函数已经需要一个非空的 MediaPlayer
参数。
接下来,只需添加一个额外的函数类型参数,该参数将作为callback
在trackDone
中使用。
将它们放在一起,您的trackDone
函数应该如下所示
fun trackDone(mediaPlayer: MediaPlayer, onComplete : (MediaPlayer) -> Unit) {
// remove unnecessary nullability checking
mediaPlayer.stop()
mediaPlayer.release()
// on complete callback
onComplete(mediaPlayer)
}
或者如果您不想返回MediaPlayer
实例,
fun trackDone(mediaPlayer: MediaPlayer, onComplete : () -> Unit) {
// remove unnecessary nullability checking
mediaPlayer.stop()
mediaPlayer.release()
// on complete callback
onComplete()
}
这就是如何使用‘理想’的方式。
fun someFunction() {
val mediaPlayer: MediaPlayer
...
...
...
trackDone(mediaPlayer) { stoppedMediaPlayer ->
// DONE
}
// or
trackDone(mediaPlayer) {
// DONE
}
}
现在,我不知道这是否像您想要实现的"completeListener“回调”工作“,但”修复“肯定会编译。
https://stackoverflow.com/questions/74198120
复制相似问题