오늘 발매 음악의 앨범타이틀에서 재생 버튼을 누르면 그 앨범의 수록곡들이 플레이리스트에 담기고,
수록곡의 첫 곡부터 재생되는 것을 구현하였다.
음악 재생은 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 에서는 인터페이스를 상속하는 것을 명시한 후, 인터페이스의 함수를 구현함으로써
앨범의 수록곡을 재생할 수 있도록 하였다.
'안드로이드개발' 카테고리의 다른 글
안드로이드 내부 데이터베이스 roomDB, 테이블(Entity)생성, DAO(메소드) (0) | 2022.01.02 |
---|---|
Viewpager2 배너 + 자동으로 슬라이딩 구현 (0) | 2022.01.02 |
seekbar 이동시 이벤트 발생(노래 이동) setOnSeekBarChangeListnener (0) | 2022.01.02 |
android: Missing required view with ID (0) | 2021.10.05 |
안드로이드 NetworkOnMainThreadException 오류 해결 (0) | 2021.08.12 |
댓글