2014-09-30 3 views
1

아래 코드는 단순화되어 관련 항목 만 표시됩니다.동적으로 추가 된 조각 정리

나는 레이아웃 XML 파일에 있습니다

<LinearLayout 
    android:id="@+id/top_row" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal"/> 

이 레이아웃은 FragmentViewPager A의 우리가 동적으로 자식 조각을 추가 할 FragmentonCreateView()에서는 FragmentStatePagerAdapter

을 사용하여 팽창, 모든 종류의 숫자가 될 수 있습니다. 이렇게하면 :

View view = inflater.inflate(R.layout.the_layout, container, false); 

FragmentManager fragmentManager = getChildFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

for(Fragment f : fragments) { 
    transaction.add(R.id.top_row, frag); 
} 

transaction.commit(); 

완벽하게 작동하여 모든 조각이 서로 잘 정렬됩니다.

여기에 문제가 있습니다. Activity의 onCreate가 다시 호출 될 때마다 ViewPager이 새 Adapter으로 설정됩니다. 그래서 나는 모든 것이 다시 재건되기를 기대합니다. 따라서 onCreateView이 호출되므로 새 View이 생성되고 Fragments이 새로 추가됩니다. LinearLayout.

실제로 발생하는 것은 이전 Fragments이 여전히 존재하는 것입니다. 새로운 Fragments은 이전에 추가 된 Fragments에 추가됩니다. 그럼 onCreateView()가 3 번 호출 한 후 내가 가진, 3 Fragments가있는 가정 해 봅시다 9.

내가 무슨 일이 일어나고 있는지 생각하십시오 FragmentsView와 ID에 의해 연결되어 있습니다, 그래서 그들은 새로운 View에 추가됩니다 너무. 내가해야 할 일 : onDestroyView()에있는 모든 Fragments을 제거하십시오. 그러나 허용되지 않습니다 ('onSaveInstanceState() 이후에는 수행 할 수 없습니다. onPause()에서 충돌이 발생합니다).

이런 식으로해서는 안되는 것이 있습니까? FrameLayout과 함께 레이아웃을 사용해야하며 여기에 FragmentTransaction.replace()을 사용해야합니까?

Activity에는 onCreate()을 제외한 다른 기능이 구현되어 있지 않습니다. 여기 어댑터를 인스턴스화하고 ViewPager

FragmentStatePagerAdapter 자체를 설정하는 순간 매우 간단합니다, getItem()은 특정 Fragment 반환

return new MyFragment(); 
+0

[Android 설명서] (https : //developer.a)에 따르면 ndroid.com/guide/components/fragments.html#Lifecycle), 단편은 부모 활동보다 오래 살아갈 수 없습니다. 귀하의 활동이 onCreate() 및 onStart()를 올바르게 구현하는지 확인해야합니다. 여기에 코드를 붙여 넣으십시오. 나는 onStop() 중에 조각을 제거하고, onStart() 중에 조각을 추가한다고 말하고 싶다. –

+0

은 'java.lang.IllegalStateException :'transaction.commit() '에서 onSaveInstanceState 이후에이 작업을 수행 할 수 없습니다. – Boy

+0

활동 라이프 사이클에서 더 많은 코드를 표시하지 않으면 힌트를 제공하기 어렵습니다. 또는 onSaveInstanceState()를 오버라이드하고이 메서드에서 중단 점을 설정하여 호출 시점과 파편 상태를 확인할 수 있습니다. –

답변

4

어떻게해야합니까 내 생각 : 모두 제거 onDestroyView()의 단편

이렇게하지 마십시오. 어떤 좋은 일도하지 않을 것입니다.

잘 모르겠습니까? - Activity을 이전에 명시 적으로 파기하지 않고 다시 작성한 경우 finish()를 호출하거나 뒤로 버튼을 누르십시오. 즉, restored from previous instance state을 의미합니다.

이 경우 트랜잭션을 다시 수행하면 안됩니다. 이는 이미 super.onCreate() Activity 메소드를 통해 자동으로 발생하기 때문입니다.실제로이 경우 조각 전송을 수행하면 동일한 조각을 두 번 추가하게됩니다 (2 인스턴스)

onCreate()savedInstanceState을 검사하여 현재 인스턴스 복원에서 호출되었는지 알 수 있습니다 매개 변수가 null인지 여부.

savedInstanceState을 확인하지 않고 트랜잭션을 수행하고 있습니다. 대신

:

내가 옳다 경우, 다음 변화는 단편 복제 문제를 해결해야

FragmentManager fragmentManager = getChildFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

for(Fragment f : fragments) { 
    transaction.add(R.id.top_row, frag); 
} 

transaction.commit(); 

쓰기 :에서

if (savedInstanceState == null) { 
    FragmentManager fragmentManager = getChildFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 

    for(Fragment f : fragments) { 
     transaction.add(R.id.top_row, frag); 
    } 

    transaction.commit(); 
} 

대한 추가 정보를 원하시면 - http://developer.android.com/guide/components/fragments.html

+0

나는 (프로젝트 압력) 이것을 시도 할 시간이 없었지만 나중에 할 것이다! 어쨌든 현상금 보상을 드리겠습니다. – Boy

+0

@boy : 감사합니다. 대답을 받아 들였지만, 현상금을 아직 보지 못했습니다. –

+0

아 .. 예. 지금은 .. 죄송합니다. :) – Boy

관련 문제