ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Fragment Usage(안드로이드 프래그먼트 사용법)
    Android/Usage 2019. 10. 21. 21:15

     매우매우 자주쓰는 Fragment에 대해 알려드리겠습니다!

     

    Fragment란?

    Fragment란, Activity보다 가벼운 하나의 종이라고 생각하시면 편합니다.

    Activity는 그 종잇장들이 붙어있는 하드보드지 같은걸로 생각하면 됩니다.

     

     좀 더 정확하게 말씀드리자면 Fragment는 Activity의 기능들을 거의 다 갖고 있습니다(거의 동일해요).

    다만 꼭 Activity 위에서 동작해야 합니다. 즉, Fragment 하나 달랑 사용할 수는 없다는 소리입니다.

     

     그럼 왜 Activity를 쓰지 Fragment를 쓰느냐?

    바로 가벼움 때문입니다. 하나의 Activity 위에 여러 Fragment를 올려놓고 바꿔가며 쓸 수 있기 때문이죠!

     

     실제 앱에서 PlayStore 같은 곳을 보시면 게임/영화/도서 같은 카테고리를 클릭했을 시 매우 빠르게 화면이 바뀝니다.

    대신 게임 하나를 클릭 해 들어가면 새로운 창이 생기며 화면 전환이 이루어집니다.

     

     직접 PlayStore를 돌아다니다 보시면 Fragment가 훨씬 화면전환 등이 빠르다는 것을 느끼실 겁니다.

     

     

    LifeCycle(생명주기)

     Activity의 가벼운 버전이기 때문에 생명주기 또한 Activity랑 매우매우 비슷합니다. 하지만 조금 다릅니다...

     

    출처: https://nkstudy.tistory.com/1

     

    Attach/Detach

     Fragment는 대체로 Activity에 있는 Layout에 배치됩니다. 따라서 해당 Layout에 붙여지는 순간이라고 볼 수 있죠!

     

    Creat/DestroyView

     보통 Activity의 onCreate()에선 setcontentview라는 놈이 Layout파일을 가시화 시킵니다.

     

    하지만 Fragment는 onCreate()이 아니라 onCreateView()에서 Layout파일을 가시화 시킵니다. 그 이유는 정확히 모르겠지만, onCreate()는 변수들을 초기화 해주는(화면 전환 등) 용도로 쓰입니다.

     

    허나 정확한건 onCreateView()에서만 View를 Inflate 시킬 수 있다는 겁니다. 

     override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            rootView = inflater.inflate(R.layout.fragment_home, container, false)
            return rootView
     }

     위 처럼 함수 자체에 LayoutInflater가 있기 때문에... 여기밖에 못써요.

     

    그리고 rootView가 레이아웃 파일을 대표한다고 보면 됩니다.

     

     

     

    나머지는 Activity와 똑같아요!

     

     

     

    Usage

     자 이제 어떻게 쓰는지 한 번 봅시다.

     

     

     네 친절히 New에 들어가면 그냥 있습니다.

     

    (전 기본이름 BlankFragment로 지었습니다)

     

    만들게 되면 fragment_blank.xmlBlankFragment.kt 두 파일이 생성 되는데

    BlankFragment.kt

     ...위 처럼 굉장히 뭔가 지저분합니다. 도움 되라고 구글에서 저렇게 준거긴 하지만... 저것들 뭐에 쓰는지 잘 모르겠어요..

     

    저흰 onCreateView() 부분만 있으면 됩니다. 다 지워버립시다!

     

    편-안

     

     

     

     보통 저 return 뒤에 있는 놈으로 View들을 불러와야 하기 때문에, 아래 사진처럼 바꿔줍시다!

     

    편-안2

     

     네. 위 처럼 rootView로 변수취급 해 주셔야 Layout 파일인 .xml에서 View들을 불러오기 편해집니다.

     

    중간에 rootView.apply { } 가 있는데, Kotlin의 강점인 기능 중 하나입니다.

     

     예를 들어 저희가 xml 파일에 TextView가 3개 있다고 했을 때,

    rootView.textView1.text = "으엑1"
    rootView.textView2.text = "으엑2"
    rootView.textView3.text = "으엑3"

    이렇게 불러와야 합니다. 하지만 apply를 적용하면

    rootView.apply{
    	textView1.text = "으엑1"
        	textView2.text = "으엑2"
        	textView3.text = "으엑3"
    }

     이런 식으로 앞의 문구를 생략 가능해집니다!

    (비슷하게 with, let 등등 많은데 다른 시간에~)

     


     그럼 이제 통상적으로 Activity에서 Fragment를 어떻게 쓰는지 보도록 하겠습니다.

     

    정말 많은 곳에 쓰입니다. ViewPager, FrameLayout 등이 대표적인데, 장면 전환이 이루어지는 곳은 대부분 Fragment로 구현한다고 보시면 됩니다.

     

     

     가장 간단한 FrameLayout으로 구현해 보죠!

    FrameLayout이란?

     Frame의 뜻이 액자의 틀을 말하기도 합니다. 따라서 액자에 여러 그림을 갈아 끼우듯이, 여러 레이아웃들이 겹쳐질 수 있도록 하는 레이아웃입니다.

     

     


     

     먼저 MainActivity를 준비합시다. 그리고 FrameLayout 하나를 만들어 줍시다.

     

    대충 저렇게 선언

     

     

    그리고 Fragment를 2개 정도 배경색만 바꿔서 만들어 놓겠습니다. BlankFragment, Blank2Fragment 2개!

     

    BlankFragment1

     

    Blank2Fragment

     

     

     

     이제 MainActivity에서 저 FrameLayout에 Fragment를 어떻게 적용해서 쓰는지 보도록 하죠.

     

    MainActivity.kt

     

     한 Activity 당 한 개의 FragmentManager를 갖고 있습니다. Activity 객체나, Context 또한 마찬가지인데요, Fragment 자체가 Activity 위에서 동작해야 하는 성질 때문에 Activity에서 그 Fragment들을 관리할 매니저가 필요한 겁니다!

     

    supportFragmentManager가 바로 해당 매니저를 불러오는 함수입니다!

     

     여튼 저 매니저로 Transaction을 시작시킵니다. 트랜젝션은 간단히 말해서 일련의 한 과정, 싸이클이라고 보시면 됩니다. 그래서 '싸이클 시작합니다!' 라는 의미로 begin 인거죠.

     

     apply는 여러 Fragment를 손 봐야 하니 달아둔건데, 일단은 하나의 Fragment 갖고 실험만....

     

     이제 요전의 FrameLayout에 BlankFragment를 달아봅시다! 매우 간단합니다. add로 추가만 해주면 되는 것이죠.

     

    첫 번째 인자는 Fragment가 들어갈 레이아웃, 두 번째 인자는 어느 Fragment인지 입니다.

     

     마지막으로 commit(제출하기)을 해 줌으로써 트랜젝션을 끝냅니다! 실행해보면

     

    안드로이드 가상 디바이스

     

     이런 식으로 BlankFragment의 검은 화면이 나옵니다.

     

     

     

     글이 너무 길어질까봐 사진은 그만두고, 코드를 쭉 써서 각 기능을 설명드리겠습니다...

     

     

     

     

    add

     위에 설명드렸듯이, 레이아웃에 Fragment를 추가하는 겁니다! 위 처럼 BlankFragment, Blank2Fragment 순으로 추가 했을 시 맨 마지막에 추가한 Blank2Fragment만이 화면에 나옵니다!

     

    show, hide

     말 그대로 보여주고, 감추는 느낌입니다! 화면에 해당 Fragment들을 감추고, 나타내게 할 수 있습니다. 이 기능을 사용해서 버튼 클릭 시 Fragment A가 보이고, Fragment B가 감춰지는 효과를 낼 수 있겠죠?

     

    replace

     말 그대로 교체하는 함수입니다! 전에 보여지던 Fragment를 대신해서, 새로운 Fragment를 보여지게 합니다.

     

    그럼 '위의 show/hide와 뭐가 다르냐!' 라고 하실 수 있습니다....

     

     바로 '살아있냐!?' 의 차이입니다. show/hide는 단순히 화면에 보여지는 것을 바꾸는건데, replace는 전에 있던 놈을 죽이고, 새로운 놈을 살리는 행위입니다.

     

    따라서 화면전환이 굉장히 자주 일어나는 경우에는 replace 보단 show/hide가 더 좋겠죠?

     

    Tag

     add나 replace 등 새로운 Fragment를 추가할 때, 해당 Fragment에 이름을 붙여주는 겁니다.

     

    '어디다 쓰냐?' 하시면 해당 Fragment를 명확하게 구분해서 나중에 써먹기 위함입니다.

     

     예를 들어, 굉장히 많이 쌓인 Fragment에서 특정 Fragment는 죽이고 싶습니다. 그럴 경우 tag가 있다면 굉장히 편리하죠!

     

     위 사진의 맨 마지막 줄을 보시면 가장 처음 Fragment의 tag를 String으로 가져오는 코드입니다.

     

     


     

     

     제가 쓴 방법들은 굉장히 기초적인 방법들입니다. 대체로 TabLayout + ViewPager를 많이 쓰게 되는데요, PlayStore 같은 곳에 탭이 있고 좌우로 슬라이드가 가능한 방식이 바로 이 방식입니다. 이는 나중에 올리도록 하겠...!

    댓글

Designed by Tistory.