android - 循环按钮函数调用 [kotlin]
问题描述
我尝试编写我的第一个应用程序。
布局:
3 个按钮控制 3 个音频流,1 个按钮从文件加载音频流。
预期行为:
- 当按下加载按钮,然后按下其他三个(控制)按钮中的任何一个时,将出现一个文件选择对话框,所选音频文件将“分配”到相应的控制按钮。
- 当按下分配的控制按钮时,如果分配的声音超过 20 秒,则按钮颜色应通过新的 xml 分配更改,并且应播放一次流。当流已经在播放时,该流的播放模式将变为无限循环。再次按下将导致停止音频流。
方法:控制按钮在 xml 文件中具有对“ControlOnClick”函数的引用,该函数应在主活动中调用。加载按钮有一个对“pickOnClick”的引用,它只会改变一个状态变量。
状态:目前不包括文件选择以保持较低的复杂性。有一个硬编码的占位符。
问题:如何循环遍历所有三个按钮,而无需为“ControlOnClick”中的每个按钮复制/粘贴开关盒?
布局 activity_main.xml 片段:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="56dp"
android:layout_marginBottom="52dp"
android:onClick="ControlOnClick"
android:text="Empty"
app:layout_constraintBottom_toTopOf="@+id/nav_view"
app:layout_constraintEnd_toEndOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="456dp"
android:onClick="pickOnClick"
android:text="Load audio"
app:layout_constraintBottom_toTopOf="@+id/button1"
app:layout_constraintEnd_toEndOf="parent" />
以及主要activity.kt中的按钮/声音持续时间功能:
fun pickOnClick(v: View){
// load button was pressed
loadactive=true
}
fun ControlOnClick(v: View) {
when (v.id) {
// button1 was pressed
R.id.button1 -> {
if (loadactive == true) {
// load sound file if load button was pressed before, rename button1 and reset
sound1 = soundPool.load(this, meldeath1, 1)
// decide if it is a short or long clip
var resID = getResources().getIdentifier("meldeath1", "raw", getPackageName())
shortcliparray[1]=getSoundDuration(resID)
button1.text = "meldeath1"
if (shortcliparray[1]==false) {
button1.setBackgroundResource(R.drawable.btn_notplaying)
}
loadactive = false
} else {
// play, loop or stop sound1
if (playbackstatus[1] == 0 && shortcliparray[1]==false) {
streamid[1] = soundPool.play(sound1, 1f, 1f, 0, 0, 1f)
button1.setBackgroundResource(R.drawable.btn_playing)
playbackstatus[1] = 1
} else if (playbackstatus[1] == 0 && shortcliparray[1]==true){
streamid[1] = soundPool.play(sound1, 1f, 1f, 0, 0, 1f)
} else if (playbackstatus[1] == 1 ) {
soundPool.stop(streamid[1])
streamid[1] = soundPool.play(sound1, 1f, 1f, 0, -1, 1f)
button1.setBackgroundResource(R.drawable.btn_looping)
playbackstatus[1] = 2
} else if (playbackstatus[1] == 2 ) {
soundPool.stop(streamid[1])
button1.setBackgroundResource(R.drawable.btn_notplaying)
playbackstatus[1] = 0
}
}
}
我检查了很多其他帖子,但根据我阅读的内容,我无法进一步了解。:(
解决方案
推荐阅读
- r - 为什么 any() 只为数字而不是逻辑 data.frame 定义?
- nginx - 为什么 ELB Health 守护进程不使用本地时区
- android - 如何在同一活动中切换不同 TextView 的可见性
- spring-boot - Spring Cloud Gateway 和 TokenRelay 过滤器
- python-3.x - 说我的计算器按钮应该可以解决但没有
- c# - ASP.Net Web Api 按选定列获取请求
- python-3.x - 使用颜色图从图像的亮度图创建 PIL 图像
- iphone - 插入邮件签名iphone时出现错误'null'
- android - React Native 的后端框架选择
- mongodb - 如何在由于此错误而无法启动的辅助副本集成员上设置 featureCompatibilityVersion?