공부/Android

FLO 앱 - 2주차

유스베리이 2024. 6. 17. 15:09
더보기

Chapter 2. Activity와 Fragment

 

setContentView(R.layout.activity_song)

이 방법은 전통적인 방법으로, 레이아웃 리소스 파일(activity_song.xml)을 직접 액티비티의 콘텐츠 뷰로 설정

setContentView(R.layout.activity_song);

 

  • 장점: 사용이 간단하고, 소규모 프로젝트나 간단한 UI에서는 충분히 효과적입니다.
  • 단점: 레이아웃 파일에 정의된 뷰에 접근하려면 findViewById를 사용해야 합니다. 이로 인해 코드가 장황해지고, 뷰를 찾는 과정에서 오류가 발생할 수 있습니다.

binding = ActivitySongBinding.inflate(layoutInflater); setContentView(binding.root)

이 방법은 뷰 바인딩(View Binding)을 사용하여 레이아웃을 설정하는 방법입니다.

뷰 바인딩은 Android Studio에서 자동으로 생성된 바인딩 클래스를 사용하여 레이아웃 파일에 정의된 뷰에 타입 안전하게 접근할 수 있게 합니다.

binding = ActivitySongBinding.inflate(layoutInflater); 
setContentView(binding.root);
  • 장점:
    • 타입 안전성: findViewById를 사용할 필요가 없으며, XML 레이아웃 파일에 정의된 뷰에 대해 자동으로 생성된 바인딩 클래스를 통해 접근합니다.
    • 컴파일 타임 검사: 존재하지 않는 뷰를 참조하려고 하면 컴파일 타임에 오류가 발생합니다.
    • 코드 간결화: 뷰에 대한 접근이 더 직관적이고 간결해집니다.

SongActivity

// Intent 객체에 "title"과 "singer"라는 추가 데이터가 있는지 확인합니다.
if(intent.hasExtra("title") && intent.hasExtra("singer")){
    // "title"과 "singer"라는 추가 데이터가 있는 경우, 해당 데이터를 텍스트 뷰에 설정합니다.
    binding.songMusicTitleTv.text = intent.getStringExtra("title")
    binding.songSingerNameTv.text = intent.getStringExtra("singer")
}

// "songDownIb"라는 ID를 가진 버튼이 클릭되면 `setPlayerStatus(true)` 메서드를 호출합니다.
binding.songDownIb.setOnClickListener{
    setPlayerStatus(true)
}

// "songPauseIv"라는 ID를 가진 버튼이 클릭되면 `setPlayerStatus(false)` 메서드를 호출합니다.
binding.songPauseIv.setOnClickListener {
    setPlayerStatus(false)
}

 

MainActivity

// `mainPlayerCl`이라는 ID를 가진 뷰가 클릭되었을 때 실행됩니다.
binding.mainPlayerCl.setOnClickListener {
    // `SongActivity`로 전환하기 위한 `Intent` 객체를 생성합니다.
    val intent = Intent(this, SongActivity::class.java)
    
    // 현재 곡의 제목과 가수를 `Intent`에 추가 데이터로 포함시킵니다.
    intent.putExtra("title", song.title)
    intent.putExtra("singer", song.singer)
    
    // `SongActivity`를 시작합니다.
    startActivity(intent)
}

 


Fragment 전환(HomeFragment ↔ AlbumFragment) 구현하기‼️

  • Fragment 전환 시 HomeFragment에서 앨범의 데이터를 AlbumFragment로 전달하여 클릭한 앨범과 동일한 앨범이 나오도록 구현해보기

 

 

Fragment 전환(HomeFragment <-> AlbumFragment

 

Bundle을 이용해 데이터 전달

binding.homeAlbumImgIv1.setOnClickListener {
    // Bundle 객체를 생성하여 데이터를 추가
    val bundle = Bundle().apply {
        putString("title", binding.titleLilac.text.toString())
        putString("singer", binding.singerIu.text.toString())
    }
    
    // AlbumFragment 인스턴스를 생성하고 번들을 인자로 설정
    val albumFragment = AlbumFragment().apply {
        arguments = bundle
    }
    
    // MainActivity의 FragmentManager를 사용하여 Fragment를 교체
    (context as MainActivity)
        .supportFragmentManager.beginTransaction()
        .replace(R.id.main_frm, albumFragment)
        .commitAllowingStateLoss()
}

 

이미지 뷰(homeAlbumImgIv1)를 클릭했을 때, AlbumFragment로 데이터를 전달하고 해당 프래그먼트를 화면에 표시하는 기능을 구현

 

Activity 전환 (MainActivity <-> SongActivity)