android - 使用片段和选项卡布局在适配器中按回时停止 MediaPlayer
问题描述
所以,我的应用程序有问题。我想构建应用音频播放器。我希望这个应用程序可以在 tablayout 上播放片段中的音频。我把音乐播放器放在适配器里。当我运行它并尝试播放音频时它运行良好,但是当活动关闭或我按下 onBackPressed 时我无法停止它。回到以前的活动时如何停止音乐播放器?
所以这是我的适配器
class AudioAdapter(private val data: ArrayList<DataQuran>,
private val listener: (DataQuran)-> Unit): RecyclerView.Adapter<AudioViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioViewHolder {
return AudioViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_audio,null,false))
}
override fun getItemCount(): Int {
return data.size
}
override fun onBindViewHolder(holder: AudioViewHolder, position: Int) {
holder.bindItem(data[position],position)
holder.itemView.onClick {
listener(data[position])
}
}
}
这是我在适配器类中的viewholderclass
class AudioViewHolder(view: View): RecyclerView.ViewHolder(view) {
private var mediaPlayer: MediaPlayer = MediaPlayer()
private val nomor: TextView = view.findViewById(R.id.nomer_urut)
private val namaSurah: TextView = view.findViewById(R.id.nama_surah)
private val ayat: TextView = view.findViewById(R.id.ayat)
private var buttonPlay: ImageView = view.findViewById(R.id.button_play)
@SuppressLint("SetTextI18n")
fun bindItem(dataQuran: DataQuran, position: Int){
var posisi = position+1
nomor.text = posisi.toString()
namaSurah.text = dataQuran.namaSurah
ayat.text = "Ayat "+dataQuran.ayat
var url_audio = "http://tahfidzta.doaqu.or.id/surah/${dataQuran.namaFile}"
try {
mediaPlayer.setDataSource(url_audio)
mediaPlayer.prepare()
}catch (e: IOException){
e.printStackTrace()
}
buttonPlay.setOnClickListener {
if (mediaPlayer.isPlaying){
buttonPlay.setImageResource(R.drawable.ic_play)
mediaPlayer.pause()
}else{
buttonPlay.setImageResource(R.drawable.ic_pause)
mediaPlayer.start()
}
}
}
}
这是我的片段之一
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
类 TirukanAyatFragment : Fragment() { var listData : ArrayList = ArrayList() lateinit var adapter: AudioAdapter
companion object {
const val KATEGORI = "kategori"
const val AUDIO = "audio"
const val SURAH = "surah"
const val AYAT = "ayat"
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_tirukan_ayat, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recycler_tirukan.setHasFixedSize(true)
recycler_tirukan.layoutManager = LinearLayoutManager(context)
ApiService.create()
.getAudio()
.enqueue(object : retrofit2.Callback<DataQuran>{
override fun onFailure(call: Call<DataQuran>, t: Throwable) {
toast(t.localizedMessage)
}
override fun onResponse(call: Call<DataQuran>, response: Response<DataQuran>) {
val data = response.body()?.data
for (audio in data!!){
if (audio.kategori == "Tirukan Ayat"){
listData.add(audio)
}
}
adapter = AudioAdapter(listData){
startActivity<AudioActivity>(
AUDIO to it.namaFile,
AYAT to it.ayat,
KATEGORI to it.kategori,
SURAH to it.namaSurah
)
}
recycler_tirukan.adapter = adapter
}
})
}
}
我试图从片段中移动对象 MediaPlayer,但出现错误“attachNewPlayer”。请帮忙,有什么解决办法吗?
解决方案
默认情况下,onBackPressed 会销毁您当前的 Activity,但在此之前应该调用 onDetach。尝试在此功能内暂停 MediaPlayer,甚至释放您的媒体播放器。
推荐阅读
- java - 在多个 jar 中外部化类
- python - 使用 mplcursors.cursor().connect() 显示栏名称
- javascript - 为什么我的 HTML 按钮在尝试切换到网页的不同部分时不起作用?
- javascript - 你如何获得 showDirectoryPicker(); 从文件系统访问 Api 到即使您将 dirHandle 存储在 IndexDB 中也不会请求许可
- javascript - 如何在标题中插入特殊脚本?
- python - 将事件流式传输到大查询 - 数据流 - 将 **epoch 时间戳** (int) 插入时间戳列的最佳方式
- bash - AWK 错误参数超出范围?如何解决这个问题呢?
- outlook - 在 Microsoft 365 Outlook 组日历中恢复已删除的日历项目
- amazon-web-services - AWS CDK methodOptions 通配符语法 - 我的直觉正确吗?
- java - 如何使用注释添加外键约束