首页 > 解决方案 > 使用片段和选项卡布局在适配器中按回时停止 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”。请帮忙,有什么解决办法吗?

标签: androidandroid-fragmentsandroid-mediaplayerandroid-tablayout

解决方案


默认情况下,onBackPressed 会销毁您当前的 Activity,但在此之前应该调用 onDetach。尝试在此功能内暂停 MediaPlayer,甚至释放您的媒体播放器。


推荐阅读