안드로이드 개발자의 창고
[39일차 Android] Fargment 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Fragment
- Fragment는 Activity내의 작은 화면 조각으로 Activity의 화면을 여러 영역으로 나누어 관리하고 하는 목적으로 사용한다.
- Activity는 독립된 실행 단위로 메모리를 많이 소모한다.
- 독립된 실행 단위가 아닌 화면만 필요한 경우 Activity 보다는 Fragment를 활용하는 것이 효율적이다.
주요 속성
속성 | 설명 |
add | Fragment를 지정된 레이아웃에 추가 |
replace | 지정된 레이아웃에 설정되어 있는 Fragment를 제거하고 새로운 Fragment를 추가 |
주요 메서드
- 안드로이드에서 back button은 현재 Activity를 종료한다.
- Fragment는 Activity가 아니므로 Back Button으로 제거할 수 없어 사용하는 메서드들
메서드 | 설명 |
addToBackStack | Back Stack에 Fragment를 순차적으로 추가 |
popBackStack | Back Stack에 있는 Fragment를 순차적으로 제거 |
Fragment 내의 View 제어
- Fragment도 Activity 처럼 ViewBinding을 사용한다.
class InputFragment : Fragment() {
lateinit var fragmentInputBinding: FragmentInputBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
fragmentInputBinding = FragmentInputBinding.inflate(layoutInflater)
...
return fragmentInputBinding.root
}
}
Activity에 접근하기
lateinit var mainActivity: MainActivity
...
mainActivity = activity as MainActivity
예제 코드
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 처음 Fragment는 backStack과 애니메이션을 넣지 않는다.
replaceFragment(FragmentName.FRAGMENT_MAIN, false, false)
}
// 지정한 Fragment를 보여주는 메서드
fun replaceFragment(name:FragmentName, addToBackStack:Boolean, animate:Boolean){
// Fragment 교체 상태로 설정
val fragmentTransaction = supportFragmentManager.beginTransaction()
// 새로운 Fragment를 담을 변수
var newFragment:Fragment? = null
// 이름으로 분기한다.
when(name){
FragmentName.FRAGMENT_MAIN -> {
// Fragment 객체를 생성한다.
newFragment = MainFragment()
}
FragmentName.FRAGMENT_INPUT -> {
newFragment = InputFragment()
}
FragmentName.FRAGMENT_RESULT -> {
newFragment = ResultFragment()
}
}
if(newFragment != null) {
// Fragment를 교체
fragmentTransaction.replace(R.id.mainContainer, newFragment)
if (animate == true) {
// 애니메이션 설정
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
}
if (addToBackStack == true) {
// Fragment를 Backstack에 추가
fragmentTransaction.addToBackStack(name.str)
}
// 교체 명령
fragmentTransaction.commit()
}
}
// Fragment를 BackStack에서 제거
fun removeFragment(name:FragmentName){
supportFragmentManager.popBackStack(name.str, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
}
// Fragment 들을 구분하기 위한 값
enum class FragmentName(val str:String){
FRAGMENT_MAIN("MainFragment"),
FRAGMENT_INPUT("InputFragment"),
FRAGMENT_RESULT("ResultFragment")
}
- replaceFragment(FragmentName.FRAGMENT_MAIN, false, false)
- 처음 Fragment는 BackStack에 넣지 않음으로 인해 Activity가 종료되면서 Fragment도 함께 종료되도록 한다.
'Computer > Android' 카테고리의 다른 글
[41일차 Android] ActionView (0) | 2023.07.01 |
---|---|
[41일차 Android] ActionBar (0) | 2023.07.01 |
[39일차 Android] Service (0) | 2023.06.29 |
[39일차 Android] Broadcast Receiver (0) | 2023.06.27 |
[39일차 Android] Thread, runOnUiThraad (0) | 2023.06.26 |