Android

[안드로이드/Fragment] Fragment 란?

gangmini 2023. 4. 21. 20:56
반응형

Fragment

  • 여러 화면을 가지고 있는 앱 = 여러 Activity를 갖는 앱 (화면 여러개 = 액티비티 여러개)
  • Activity는 독립된 실행단위 -> 실행단위 유지 위한 다양한 기능 보유, 메모리 소모 큼  => 독립된 실행단위가 아닌 그냥 화면만 필요한 경우라면 Fragment 사용이 효율적
  • Activity 내의 작은 화면 조각으로서 Activity 화면을 여러 영역으로 나누어 관리
  • 두개의 서로 다른 액티비티에 같은 화면이 필요할 경우 fragment를 재사용해 관리하면 좋음

Frgament 프로퍼티

  • add : 지정된 레이아웃 안에 Fragment 추가 -> 액티비티 안에서 어디에 어떤 프래그먼트를 배치할지 설정 
  • replace : 지정된 레이아웃에 설정되어 있는 Fragment 제거하고 새로운 Fragment 추가

[MainActivity.kt]

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
    val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
    setContentView(view)

    val frag1 = FirstFragment() // 프래그먼트 객체 생성
    val frag2 = SecondFragment()

    binding.button.setOnClickListener {
        // 프래그먼트 작업 시작
        val tran = supportFragmentManager.beginTransaction()

        // 프래그먼트를 세팅
        //tran.add(R.id.container1, frag1) //어디에 프래그먼트를 배치할지를 세팅 //액티비티가 관리하고 있는 화면에 레이아웃을 지정 // 추가했는데 똑같이 또 추가하면 에러남
        tran.replace(R.id.container1, frag1)
        tran.commit() //액티비티의 레이아웃 container1 에 프래그먼트 배치됨
    }
    
    binding.button2.setOnClickListener {
        val tran = supportFragmentManager.beginTransaction()

       // tran.add(R.id.container1, frag2) // 이렇게 설정해주면 frag1 위에 겹쳐져서 올라감
        tran.replace(R.id.container1, frag2) // 따라서 replace를 통해 왔다갔다 해주는게 나음음
        tran.commit()
    }

}

✔️ supportFragmentManager는 프래그먼트를 추가/교체/제거 등의 관리를 해주는 매니저 역할

 

[FirstFragment.kt / SecondFragment.kt]

class FirstFragment : Fragment() {

    // 여기에서 만든 View를 Fragment의 View로 사용  // 프래그먼트가 다 보여줄 준비가 되면 이 메서드가 자동으로 호출됨
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.fragment_first,null)

        return view
    }
}

replace 를 사용해 화면 전환

 

AddToBackStack

  • 안드로이드에서 Back Button은 현재 Activity의 종료를 의미
  • Fragment는 액티비티가 아니므로 Back Stack 에 들어가지 않고, Back Button으로 제거 X  ,But, AddToBackStack 메서드를 통해 Back Stack에 포함된 경우에는 Back Button으로 제거 가능 => 이를 화면에 이전 화면으로 돌아간듯한 효과 줄 수 있음

binding.button.setOnClickListener {
    // 프래그먼트 작업 시작
    val tran = supportFragmentManager.beginTransaction()

    // 프래그먼트를 세팅
    //tran.add(R.id.container1, frag1) 
    tran.replace(R.id.container1, frag1)
    tran.addToBackStack("frag1") //back stack 내에서 구분용 문자열
    tran.commit() 
}

binding.button2.setOnClickListener {
    val tran = supportFragmentManager.beginTransaction()

   // tran.add(R.id.container1, frag2) // 이렇게 설정해주면 frag1 위에 겹쳐져서 올라감
    tran.replace(R.id.container1, frag2) // 따라서 replace를 통해 왔다갔다 해주는게 나음
    tran.addToBackStack("frag2")
    tran.commit()
}
반응형