[Android Studio] 프래그먼트

hui·2023년 8월 14일

AndroidStudy

목록 보기
2/7

Fragment

안드로이드에서 화면을 전환하는 방법은 두 가지가 있다.
1. 새로운 액티비티를 띄우는 방식, 2. 액티비티의 일부만 바꾸는 방식(프래그먼트)

프래그먼트란, 액티비티(Activity) 내에서 재사용 가능한 모듈 혹은 UI 구성 요소이다.

액티비티 전환은 전체화면이 새롭게 그려지는 반면, 프래그먼트는 하나의 액티비티 내에서 일부분을 교체하여 화면을 구성의 변화를 주기 때문에 조각화면(fragment) 으로도 구성할 수 있어 더 적은 리소스와 시간을 사용하여 원하는 결과를 얻을 수 있다.

특징

  • 여러개의 프래그먼트를 하나의 액티비티에 조합하여 여러 UI를 구축 가능.

  • 자체 라이프 사이클(생명주기)를 갖고 있어, 액티비티와 독립적으로 코드를 관리 가능.
    (액티비티에서 그려지는 것이기 때문에 독자적으로 사용은 불가. 액티비티나 프래그먼트 뷰 계층에 속한다.)

  • 프래그먼트를 사용하면 한 화면의 일부분을 다른 화면에서도 사용할 수 있게 되어, 화면 구성의 재사용성이 높아짐.

  • 앱의 구조를 프래그먼트 단위로 나눠 관리할 수 있어 모듈화가 되며, 이를 통해 각 모듈별로 쉽게 수정하거나 업데이트할 수 있어 유지 보수가 더 편리.

+

  • Activity가 Fragment를 포함하고 있고, Fragment가 또 다른 하위 Fragment를 가질 때가 있다. 이때 호스트하는 쪽은 FragmentManager라는 클래스의 객체로 하위 Fragment들을 관리할 수 있다.
  • Fragment는 호스팅한 Activity나 Fragment가 Started거나 이상인 경우에 Fragment를 추가, 교체, 삭제할 수 있고, 이 과정에서 생명주기를 갖는다.

  • 이렇게 추가, 교체, 삭제된 기록들은 FragmentManager로 의해 백스택에 저장된다.

프래그먼트 생명주기

👉 사용법

어떤 버튼을 눌렀을 때, (액티비티 -> 프래그먼트) (프래그먼트 -> 프래그먼트) 로 이동시키는 간단한 예제를 준비해보았다.

프래그먼트 뷰 바인딩

ex)

val binding = Fragment1Binding.inflate(inflater, container, false)
//뷰 바인딩 설정.


binding.myButton.setOnClickListener {...}
//바인딩 사용


return binding.root
//레이아웃 뷰 반환. 
//onCreateView() 메소드에서 반환하는 뷰를 화면에 띄우게 된다.


//현재는 onCreateView() 내부에서 binding 변수를 만들어 지역변수 처럼 사용하고 있지만 
lateinit 등을 활용해 전역변수로 선언해 사용해도 된다.

프래그먼트 간의 화면전환

FragmentManager : 백스택 관리, FragmentTransaction 등을 생성하는 클래스.

FragmentTransaction : Android Jetpack Fragment 라이브러리에서 제공하는 클래스로 프래그먼트를 '추가, 교체, 삭제' 작업을 제공. 프래그먼트 백 스택관리, 프래그먼트 전환 애니메이션 설정가능.

//바인딩을 사용해 레이아웃의 버튼을 눌렀을 때, 
만들어놓은 프래그먼트로 넘어가게 만드는 코드이다.

...
binding.togoFragment1.setOnClickListener{
            val fragment1 = Fragment1()
	    supportFragmentManager
               .beginTransaction()
               .add(R.id.framelayout, fragment1)
               .commit()
        }
... 

//supportFragmentManager를 사용하여 지원 라이브러리의 FragmentManager에 접근하고, 
프래그먼트 트랜잭션을 시작하고 관리할 수 있다.
    

👉 마무리

친구들과 협업할 때 버스타지 않고 함께 개발하고 싶다는 생각과
발전의 흥미로 천천히 연습한 것을 기록해 봅니다 ✍️
더하여서 계획하는 프로젝트에 한 걸음 더 나아가고파요.

프래그먼트를 활용하는 jetpack Navigation 라이브러리 정리도 조만간 해볼게요.

profile
백엔드 개발자로 변신.

0개의 댓글