📕프래그먼트
- 액티비티처럼 동작하는 뷰 클래스
- 액티비티의 사용자 인터페이스를 여러 개의 조각으로 나눈 것
- 여러 개의 프래그먼트를 조합하여 액티비티가 출력하는 한 화면의 UI를 표현할 수 있음.
- xml 상에서는 FrameLayout 태그 안에서 코드를 작성함.
📕프래그먼트 생명주기
- onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume()
📕Fragment 소스 코드
- 파일을 생성하면 자동으로 onCreateView()가 생성됨
- 자동 호출되며 반환한 View 객체가 화면에 출력됨.
이렇게 하나의 화면에서 여러 개의 프래그먼트를 조합하여 UI를 표현할 수 있다.
📕MainActivity 코드
- FragmentTransaction : 프래그먼트를 이동시키는 것.
- 현재 프래그먼트의 상태를 저장할 변수도 하나 필요하다. ex ) presentFragment : Fragment?
- fragmentManger 클래스
- beginTransaction() : FragmentTransaction 객체 반환 (추가, 삭제, 변경 기능)
- FragmentTransaction 클래스
- replace(containerViewID : int, fragment : Fragment!)
- containerViewid는 FrameLayout의 id를 사용
- commit() : 화면 적용
- replace(containerViewID : int, fragment : Fragment!)
package com.example.chap10_fragment
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import com.example.chap10_fragment.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var transaction: FragmentTransaction
var presentFragment: Fragment? = null
lateinit var fragmentManager : FragmentManager
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
var firstFragment = FirstFragment()
var secondFragment = SecondFragment()
var thirdFragment = ThirdFragment()
fragmentManager = supportFragmentManager
binding.btnFirst.setOnClickListener {
replaceTransaction(firstFragment)
}
binding.btnSecond.setOnClickListener {
replaceTransaction(secondFragment)
}
binding.btnThird.setOnClickListener{
replaceTransaction(thirdFragment)
}
}
fun replaceTransaction(fragment: Fragment) {
if(presentFragment == fragment) {
Toast.makeText(this, "이미 해당 Fragment를 보여주고 있습니다.",
Toast.LENGTH_SHORT).show()
return
}
transaction = fragmentManager.beginTransaction()
transaction.replace(binding.fragmentContainer.id, fragment).commit()
presentFragment = fragment
transaction.addToBackStack(null)
}
}
🔎addToBackStack
- replace를 사용하면 기존의 Fragment들은 버려진다.
- 하지만 addToBackStack를 사용하면 버리지 않고 BackStack에 차곡차곡 쌓인다고 한다.
- 이때 BackStack에 들어가 있는 Fragment들은 Pause상태로 유지(지워지지 않음)
- addToBackStack(프래그먼트 이름) 형식
- 위 코드는 이름을 지정하고 싶지 않아서 null을 줬다.
- 이거에 관해서는 나중에 따로 좀 깊게 파고들어서 공부해야 할 것 같다.
✔내 마음대로 느낀 점
- main에 xml파일에 형태를 그대로 따라가면서 보여줄 수 있는 화면이 여러 개인 기능인 거 같은데 프로젝트하면서 유용하게 쓰일 수 있는 부분인 거 같습니다.
- 만들기만 하면 자동적으로 만들어지는 함수가 생각보다 많아서, 구현도 간단한 편인 것 같습니다.
- main.xml 파일을 활용하고 싶고, 여러 화면을 보여주고 싶을 때 사용하면 될 거 같습니다.
- (제 주관입니다.)
'Skils > Android' 카테고리의 다른 글
[Android] - 안드로이드 활동 생명주기(Activity LifeCycle) (0) | 2022.12.22 |
---|---|
[프로젝트] - 모앱1 프젝을 마치며... (2) | 2022.12.16 |
[Android] - androidx 라이브러리 (액션바,메뉴 구현) (0) | 2022.11.20 |
[Android] Log 와 Logcat , 사용자 이벤트 처리 (0) | 2022.10.14 |
[Android] - Layout이란 (0) | 2022.10.07 |