如何使用变量 Android 访问文件 Studio Kotlin
How to access files with a variable Android Studio Kotlin
我的适配器中的每个单词都有一个 mp3 文件,因此我希望 MediaPlayer 根据 RecyclerView 的索引创建新的声音
演示我想要的东西:
如果 RecyclerView 的第 0 个索引是 Mother,
mp = MediaPlayer.create(holder.itemView.context, R.raw.mother)
如果 RecyclerView 的第一个索引是父亲,
mp = MediaPlayer.create(holder.itemView.context, R.raw.father)
为了解决这个问题,我尝试了:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items[position]
holder.vocabularyItem.text = item.vocab
holder.vocabularyTranslation.text = item.Translation
mp = MediaPlayer.create(holder.itemView.context, R.raw.${item.vocab})
mp.setVolume(0.5f, 0.5f)
holder.symbol.setOnClickListener {
mp.start()
}
}
但是这部分报错:
mp = MediaPlayer.create(holder.itemView.context, R.raw.${item.vocab})
如何使用变量访问 R.raw 中的文件?
编辑:
按照建议,我将相关代码更改为:
mp = MediaPlayer.create(holder.itemView.context, holder.itemView.context.resources.getIdentifier(item.vocab.toLowerCase(), "raw", holder.itemView.context.packageName))
代码现在可以工作了,但它只说明了 recyclerView 的最后一个元素。
当点击第 0 个索引时,妈妈,它说“爸爸”
当点击第一个索引,父亲,它又说“父亲”
我在下面的代码中检查了recyclerView是否有问题:
holder.vocabularyItem.setOnClickListener {
Toast.makeText(holder.itemView.context, "hello you just clicked on: ${item.vocab.toLowerCase()}", Toast.LENGTH_SHORT).show()
}
Toast 消息分别显示“母亲”和“父亲”,这表明 recyclerView 工作正常。有谁知道以 mp 开头的部分有什么问题吗?
我能想到的两个解决方案:
- 创建一个映射来存储词汇到原始资源的映射。
- 创建Kotlin 扩展函数以方便地将资源名称转换为资源Id。见 How to get a resource id with a known resource name?
您编辑中的问题是由您执行 mp.create 和 mp.play 的方式造成的。您有一个单独的 MediaPlayer 变量将值存储在 onBind 中。这意味着播放器将在最后一次调用 onBind 时为该文件。您需要在按钮处理程序中创建和播放媒体播放器,或者您需要在创建此适配器时创建一次但在点击处理程序中更改源。最好是第二种解决方案,因为创建媒体播放器并不便宜。
我的适配器中的每个单词都有一个 mp3 文件,因此我希望 MediaPlayer 根据 RecyclerView 的索引创建新的声音
演示我想要的东西:
如果 RecyclerView 的第 0 个索引是 Mother,
mp = MediaPlayer.create(holder.itemView.context, R.raw.mother)
如果 RecyclerView 的第一个索引是父亲,
mp = MediaPlayer.create(holder.itemView.context, R.raw.father)
为了解决这个问题,我尝试了:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items[position]
holder.vocabularyItem.text = item.vocab
holder.vocabularyTranslation.text = item.Translation
mp = MediaPlayer.create(holder.itemView.context, R.raw.${item.vocab})
mp.setVolume(0.5f, 0.5f)
holder.symbol.setOnClickListener {
mp.start()
}
}
但是这部分报错:
mp = MediaPlayer.create(holder.itemView.context, R.raw.${item.vocab})
如何使用变量访问 R.raw 中的文件?
编辑:
按照建议,我将相关代码更改为:
mp = MediaPlayer.create(holder.itemView.context, holder.itemView.context.resources.getIdentifier(item.vocab.toLowerCase(), "raw", holder.itemView.context.packageName))
代码现在可以工作了,但它只说明了 recyclerView 的最后一个元素。
当点击第 0 个索引时,妈妈,它说“爸爸” 当点击第一个索引,父亲,它又说“父亲”
我在下面的代码中检查了recyclerView是否有问题:
holder.vocabularyItem.setOnClickListener {
Toast.makeText(holder.itemView.context, "hello you just clicked on: ${item.vocab.toLowerCase()}", Toast.LENGTH_SHORT).show()
}
Toast 消息分别显示“母亲”和“父亲”,这表明 recyclerView 工作正常。有谁知道以 mp 开头的部分有什么问题吗?
我能想到的两个解决方案:
- 创建一个映射来存储词汇到原始资源的映射。
- 创建Kotlin 扩展函数以方便地将资源名称转换为资源Id。见 How to get a resource id with a known resource name?
您编辑中的问题是由您执行 mp.create 和 mp.play 的方式造成的。您有一个单独的 MediaPlayer 变量将值存储在 onBind 中。这意味着播放器将在最后一次调用 onBind 时为该文件。您需要在按钮处理程序中创建和播放媒体播放器,或者您需要在创建此适配器时创建一次但在点击处理程序中更改源。最好是第二种解决方案,因为创建媒体播放器并不便宜。