안드로이드개발

Fragment 에서 이벤트 발생 시 Activity 에서 발생할 행동 구현하기

아뵹젼 2022. 1. 2.

오늘 발매 음악의 앨범타이틀에서 재생 버튼을 누르면 그 앨범의 수록곡들이 플레이리스트에 담기고,

수록곡의 첫 곡부터 재생되는 것을 구현하였다.

 

음악 재생은 MainActivity 에서 구현하며,

오늘 발매 음악의 앨범들은 HomeFragment 에서 RecyclerView 로 구현이 된 상태이다.

 

따라서 HomeFragment 의 앨범 재생버튼을 누르면, 

MainActivity 에서 터치 이벤트가 발생한 앨범의 수록곡들을 재생해야 하는 로직으로 구성되야 한다.

 

이를 구현하기 위해 Interface 를 이용하였다.

Fragment 에서 인터페이스 리스너 변수를 하나 생성하고, 리사이클러뷰에 터치 이벤트가 발생하면, 인터페이스의 함수를 실행하는 것이다.

그렇다면, MainActivity 에서 인터페이스의 함수를 구현하여, 하고 싶은 행동을 할 수 있게 된다.

 

package com.example.flo

interface OnAlbumClickListener {
    fun onAlbumClick(album: Album)
}

인터페이스는 다음과 같다.

 

  private lateinit var mAlbumClickListener: OnAlbumClickListener
  .
  .
  .
  mAlbumClickListener = mContext

HomeFragment 에서 다음과 같은 인터페이스 리스너를 하나 생성한 후, 

리스너에 mContext( = MainActivity ) 를 대입하였다.

이때 mContext 는 Fragment 의 context 를 의미한다. 즉, Fragment 가 실행된 Activity 의 context 를 매개변수로 받아온 것이다.

 

 

//리스너 객체 생성 및 전달
        albumRecyclerViewAdapter.setMyItemClickListener(object : AlbumRVAdapter.MyItemClickListener{
            override fun onItemClick(album: Album) {
                startAlbumFragment(album)
            }

            override fun onPlayAlbum(album: Album) {
                mAlbumClickListener.onAlbumClick(album)
            }
        })

그런 후, recyclerview의 adapter 에서 앨범클릭 리스너에 이벤트가 발생하면,  앨범을 재생할 수 있도록 리스너의 함수

( = onAlbumClick ) 를 실행하였다.

 

class MainActivity : AppCompatActivity(), OnAlbumClickListener {
.
.
.

// interface 구현
    override fun onAlbumClick(album: Album) {

        if (timer != null) {
            timer!!.isPlaying = false
            timer!!.interrupt() // 스레드를 해제함
        }
        Log.d("thread 해제", "앨범클릭")
        mediaPlayer?.release() // 미디어플레이어가 가지고 있던 리소스를 해방
        mediaPlayer = null // 미디어플레이어 해제
        nowPos = 0

        songs.clear()
        songDB = SongDatabase.getInstance(this)!!
        songs.addAll(songDB.songDao().getSongsInAlbum(album.id))
        for (i in songs){
            i.second = 0;
            i.isPlaying = true
        }

        startTimer()
        setPlayer(songs[nowPos])
    }

MainActivity 에서는 인터페이스를 상속하는 것을 명시한 후, 인터페이스의 함수를 구현함으로써

앨범의 수록곡을 재생할 수 있도록 하였다.

 

댓글