6

저는 안드로이드 ViewPager의 수명주기가 정말 엉망이되어서, 앱의 구조에 뭔가 이상하다고 생각하기 시작했습니다. 따라서 다음을 수행 할 수 있는지 확인하는 것이 좋습니다.대체 된 ViewPager 및 BackStack의 수명주기?

  • 몇 가지 탭이있는 응용 프로그램이 있습니다. 이 중 하나의 탭은 두 개의 ListFragments가있는 ViewPager를 보여줍니다. 이러한 ListFragments 은 ViewPager의 onCreate 이벤트에서 생성됩니다.
  • ListFragments 중 하나에서 항목을 클릭하면 전체 ViewPagerFragment가 다른 조각 (다른 하나는 ListFrament 임)으로 대체됩니다. 여기

내가 새로운 ListFragment 거기에서

FragmentManager fm = getFragmentManager(); 
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction(); 

ft.replace(R.id.container, new RequestForm(requestsList.get(itemIndex))); 
ft.addToBackStack(null); 
ft.commit(); 

으로 ViewPager를 대체하기 위해 사용하는 코드이며, 모든 것이 잘 작동한다. 사용자가 뒤로 버튼을 클릭한다면, 나는 다음과 같은 상황을 얻을 :

  • ViewPager이 (onCreateView에서) 잘 다시로드되지만 ListFragment 내부에 표시되지 않습니다. 내 ListFragment의 객체가 여전히 살아있는 것처럼 보입니다. 그러나 그들은보기를 잃어 버렸고, ViewPager가 종료 된 동안 객체가 잠자기되지 않았으므로 onCreateView가 이 다시 생성되도록 호출하지 않았습니다.

내 의도는 내가하고 싶은 일이 안드로이드 방식인지 확인하는 것이므로 여기에 더 많은 코드를 게시하는 것이 아닙니다. 내가하고 싶은 것을 보관하려면 Android SDK와의 싸움을해야합니까?

답변

19

글쎄, 내가 볼 수 있듯이, 나는 안드로이드 사용자가 아니야 (iOS의 UI에 대해 더 많이 알고있다). 이것이 내가 혼란 스러웠던 이유입니다.

다른 응용 프로그램을 살펴본 후 Gmail과 Google Play에서 새로운 활동을 만들지 않고 새로운 조각으로 ViewPager를 교체하는 것과 비슷한 탐색 기능이 있다는 것을 알게되었습니다.

내 문제는 구조적인 문제가 아니 었습니다. FragmentStatePagerAdapter를 만들 때는 getFragmentManager()가 아닌 getChildFragmentManager()를 사용해야합니다!

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); 
+1

위에서 설명한 것과 똑같은 문제가 있으며 getChildFragmentManager를 전달하여 어댑터를 설정하면 문제가 해결됩니다. 감사! 이제 마지막으로 본 위치를 저장하고 백 스택을 팝핑 할 때이를 복원하는 방법을 알아 내야합니다. – speedynomads

+2

내 삶을 살았습니다. 감사. – Paul

+0

굉장해! 감사! –