본문 바로가기

이상/Andrioid

[Android/Kotlin] Fragment에 대하여

반응형

이번에는 거의 대부분의 Android 앱에서 사용하는 Fragment에 대해 정리하려고 한다.

 

우선, Android 앱을 만드는 데에 기초적인 페이지의 역할을 하는 ActivityFragment가 있다.

 

아래는 Activity와 Fragment의 대표적인 특징이다.

 

 

ActivityAndroid Application의 기본 구성단위로 사용자가 앱에 접근하도록 해주는 일종의 페이지이다.

 

Acticity없이는 앱을 사용할 수 없으며 하나의 Activity는 있어야 앱을 사용할 수 있다.

 

 

Fragment항상 Activity 내에서 호스팅 되어야 하며 Activity에 종속적인 생명주기를 가진다.

 

때문에 Fragment는 Activity의 모듈과 같이 사용되어야 하며,

 

하나의 Activity 여러 개의 Fragment 가질 있고 하나의 Fragment 여러 개의 Activity에서 사용될 있다.

 

 

Activity와 Fragment를 적절히 잘 사용해야한다는 의미다.

 

그럼 Fragment를 사용하면서 얻는 이점은?

 

앱이 좀 더 가벼워진다.

 

앱이 가벼워진다는 것은 사용자의 입장에서 앱을 사용하기에 쾌적하다는 의미이며

 

이것만으로도 Fragment를 사용할 이유로 충분하다.

 

 

 

1. 생명주기

 

Fragment는 Activity에 종속적이면서 몇가지 자체적인 생명주기를 가진다.

 

Fragmet의 생명주기

 

onAttach()

Acticity에 Fragment가 attach될 때 호출되며 인자로 context가 주어진다.

 

1
2
3
4
5
6
override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is MainActivity) {
        mContext = context
    }
}
 
cs

 

주어진 context는 이런 식으로 사용하게 된다.

(참고로 Fragment에서 Activity에서 context를 가져올 때 getActivity()를 사용하는 것보단

onAttach()의 인자로 넘겨진 context를 사용하는 것이 더 안전하다고 한다.)

 

 

onCreate()

View에 대한 부분을 제외하고

Fragment를 생성하면서 필요한 변수나 리소스를 초기화하는 부분이다.

(View에 대한 초기화는 onActivityCreated()에서)

 

 

onCreateView()

inflater를 이용하여 Fragment의 View을 구성하는 부분이다.

Google map을 사용할 때 이 부분에서 지도 관련 View를 초기화해줬었다.

 

 

onActivityCreated()

Activity의 onCreate()가 반환될 때 호출된다.

Activity와 Fragment의 View가 모두 생성된 상태이므로

View 대한 작업은 여기서 처리해야 한다.

 

 

onPause()

다른 Activity가 Fragment의 부모 Activity 위로 호출되면

onPause()를 호출하면서 backstack으로 들어가게 된다.

 

 

onStop()

호출된 다른 Activity가 완전히 화면을 가리면 onStop()이 호출되며

사용자가 해당 Activity를 호출하면 다시 복원될 수 있는 상태이다.

 

 

onDestroyView()

onCreateView()에서 생성한 View가 Fragment에서 분리되었을 때 호출되며,

Fragment를 다시 보여줘야할 때 새로운 View가 생성된다.

 

 

 

2. Fragment 사용하기

 

Fragment를 사용하는 방법은 크게 2가지가 있다.

 

<fragment></fragment> 태그를 이용하여 호출하거나

 

Layout에 supportFragmentManager를 이용하여 호출하는 방법이 있다.

 

 

1) XML을 사용하여 Fragment 추가하기

 

XML에서 아래와 같이 <fragment></fragment>를 추가하면

 

Activity의 해당 영역에 지정된 Fragment가 보여지게 된다.

 

1
2
3
4
5
6
<fragment
    android:id="@+id/fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.furang.FragmentTest.YellowFragment">
</fragment>
 
cs

 

YellowFragment

 

 

그럼 다른 Fragment를 띄울 때는 어떨까?

 

똑같이 <fragment></fragment> 태그의 name 속성에 다른 Fragment를 지정하거나

 

Activity의 소스에서 바꿔줄 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(
                R.id.fragment,
                OrangeViewFragment()
        )
        transaction.commit()
    }
}
 
cs

 

supportFragmentManager를 이용하여

 

fragment 영역에 원하는 Fragment를 add한다.

 

OrangeFragment

 

 

2) supportFragmentManager 이용하기

 

XML에서 Layout으로 Fragment의 영역을 지정하고 id를 부여한다.

 

1
2
3
4
5
6
7
8
9
10
<LinearLayout
    android:id="@+id/fragmentFrame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent">
</LinearLayout>
 
cs

 

소스에서 supportFragmentManager를 이용하여 해당 layout에 원하는 Fragment를 배치한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val transaction = supportFragmentManager.beginTransaction()
        transaction.add(
            R.id.fragmentFrame,
            YellowFragment()
        )
          
        transaction.commit()
    }
}
 
cs

 

결과는 1과 똑같다.

 

다른 Fragment를 띄울 때 또한 똑같다.

 

새로운 supportFragmentManager를 이용하여 새로운 Fragment를 add()한다.

 

 

 

처음 안드로이드 개발을 하면서

 

Fragment를 사용하는 예제를 찾을 때 대부분 2번과 같이 사용하는 분위기였다.

(나 또한 그렇다)

 

하지만

 

XML에서 Fragment를 바로 연결하는 1번이나

 

Layout만 잡아두고 소스상에서 Fragment를 연결하는 2번이나

 

Fragment를 교체해야하는 상황에 supportFragmentManager를 사용해야하기 때문에

 

두 방법에 별 차이는 없는 것 같다.

 

 

 

참고

https://developer.android.com/guide/components/fragments?hl=ko

https://developer88.tistory.com/69

 

 

 

 

 

반응형