Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[39일차 Android] Fargment 본문

Computer/Android

[39일차 Android] Fargment

Wise-99 2023. 7. 1. 18:40

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Fragment

  • Fragment는 Activity내의 작은 화면 조각으로 Activity의 화면을 여러 영역으로 나누어 관리하고 하는 목적으로 사용한다.
  • Activity는 독립된 실행 단위로 메모리를 많이 소모한다.
  • 독립된 실행 단위가 아닌 화면만 필요한 경우 Activity 보다는 Fragment를 활용하는 것이 효율적이다.

 

주요 속성

속성 설명
add Fragment를 지정된 레이아웃에 추가
replace 지정된 레이아웃에 설정되어 있는 Fragment를 제거하고 새로운 Fragment를 추가

 

주요 메서드

  • 안드로이드에서 back button은 현재 Activity를 종료한다.
  • FragmentActivity가 아니므로 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