Bucket Place/Android

[Android] ViewPager Problem in Fragment

Cloud Travel 2014. 6. 13. 12:45

[현재의 일반적인 안드로이드 코딩]


Fragment를 지원하지만, Fragment 안에 Fragment가 들어 가지 못하는 버전이 있다.

(진저브레드~아이스크림센드위치까지...)


현실적으로 키켓에 맞춰서 코딩을 하면 사용자수가 한 10%로 한정되기 때문에 이에 대한 대응을 해줘야 한다.


Activity의 페이지 전환을 Fragment로 갈아치우는 형식으로 만드는 것이 대세인 세상이 되고 있다.



[Viewpager Problem in Fragment]


Fragment에서 ViewPager를 사용하려고 하면 다음과 같은 오류가 발생한다.

가끔씩 Viewpager에서 스왑핑시 화면이 사라지는 것을 볼 것이다. (ViewPager 프로그먼트 사라짐)

영어로 검색한다면 viewpager fragment disappear가 될 것이다.


잘 생각해보면 이 문제의 원인으로 처음 생각나는 것은 아래와 같다.

바로 Fragment안에서 Fragment를 또 부르는 현상이 발생한 것이다.

하지만, 코딩시에 오류가 발생하지 않는 것을 보면 안드로이드 자체적으로 이 경우에 대해서는 예외적으로 처리를 해주는 것 같다.


그렇다면, 어떤 것을 고쳐줘야 할것인가?


흔히, Activity자체에 ViewPager를 구현할때 ViewPagerAdapter를 생성해주고 그곳에 FragmentManager를 보내준다.

즉, 그림을 본다면 아래와 같이 될 구조이다.

여기서 FragmentManager를 호출하면 명확히 이것은 ViewPager를 위한 FragmentManager를 호출 할 것이다,


하지만, 문제가되고 있는 현재의 구조, Activity하나에 Fragment로 화면 이동을 구성하고, 그 안에 ViewPager를

위치했을 경우에는 아래와 같은 구조로 그림이 나타날 것이다.

여기서 FragmentManager를 호출하게 되면, ViewPager를 위한 것이아니라 Activity에서 화면 전환을 위한

FragmentManager를 호출하게 된다. 즉, 참조하는 FragmentManager가 ViewPager를 위한 것이 아니라는 것이다.



[Solution]


솔루션은 매우 간단하다. Fragment안에 Fragment가 들어갈 경우에 많이 사용하게 될 것 같은 함수를 호출해주면된다.


getChildFragmentManager()

이를 아뎁터 생성시에 적어주면 된다.

ex) [ViewPager].setAdater(new [ViewPagerAdapter](getChildFragmentManager()));


이는 현재 프레그먼트에서 한단계 안에 있는 프래그먼트의 매니저를 호출 한다. 



[참조페이지]

http://stackoverflow.com/questions/18483258/viewpagers-fragments-disappear