我的配接器中的每個單詞都有一個 mp3 檔案,所以我希望 MediaPlayer 根據 RecyclerView 的索引創建一個新聲音
為了證明我想要什么:
如果 RecyclerView 的第 0 個索引是母親,
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 個索引,mother,它說“father” 當單擊第 1 個索引,father,它又說“father”
我在以下代碼中檢查了 recyclerView 是否有問題:
holder.vocabularyItem.setOnClickListener {
Toast.makeText(holder.itemView.context, "hello you just clicked on: ${item.vocab.toLowerCase()}", Toast.LENGTH_SHORT).show()
}
Toast 訊息分別顯示“Mother”和“Father”,這表明 recyclerView 作業正常。有誰知道以 mp 開頭的部分有什么問題?
uj5u.com熱心網友回復:
您編輯中的問題是由您執行 mp.create 和 mp.play 的方式引起的。您有一個將值存盤在 onBind 中的 MediaPlayer 變數。這意味著播放器將在最后一次呼叫 onBind 時為該檔案。您需要在按鈕處理程式中創建和播放媒體播放器,或者您需要在創建此配接器時創建一次,但在單擊處理程式中更改源。最好是第二種解決方案,因為創建媒體播放器并不便宜。
uj5u.com熱心網友回復:
我能想到的兩個解決方案:
- 創建一個映射來存盤詞匯到原始資源的映射。
- 創建 Kotlin 擴展函式以方便地將資源名稱轉換為資源 Id。請參閱如何獲取具有已知資源名稱的資源 ID?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439053.html
上一篇:AndroidStudio回傳錯誤“安裝失敗,原因是:''cmdpackageinstall-create...”
