2013-04-07 2 views
1

FragmentPagerAdapter를 사용하여 MyFrag 유형의 여러 탭 (조각으로 묶음)을 표시합니다. MyFrag.onCreateView() 내에서 내부적으로 두 개의 조각을 프로그래밍 방식으로 확장합니다 : MyInternalF1 및 MyInternalF2.Android PagerAdapter, 수동으로 부풀린 조각 추가 문제

내가 얻는 것은 어색한 디스플레이 결과입니다. 외부 MyFrag 인스턴스는 괜찮 으면서 해당 탭과 연관됩니다. 그러나 내부 프래그먼트는 잘못된 조각 안에 내장되어 있습니다. 첫 번째 MyFrag에는 내부 Frag가 포함되어 있지만 두 번째, 세 번째 등의 MyFrag에는 내부 Frag가 없거나 다른 Frament의 내부 Frag가 있습니다. 내부 조각은 정상적으로 작동합니다. 조각은 무작위로 조각에 있습니다. 나는 V13 샘플에서 탭/호출기 샘플 위젯을 사용하고

: 샘플/Support13Demos/SRC/COM/예/안드로이드/supportv13/응용 프로그램/FragmentPagerSupport.java

의사 코드 :

Class MyFrag extends Fragment 
{ 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container,Bundle savedInstanceState) 
{ 
    super.onCreateView(inflater, container, savedInstanceState); 
    .... 
    FragmentTransaction trans = getFragmentManager().beginTransaction(); 
    trans.add(R.id.myfragContainer, new MyInternalF1, "InternalF1"); 
    trans.add(R.id.myfragContainer, new MyInternalF2, "InternalF2"); 
    trans.commit(); 
    .... 
} 

답변

1

FragmentTransaction.add() 함수에 문제가 있습니다. 첫 번째 매개 변수로 포함 된 뷰의 ID 인 containerViewId가 필요합니다. 보기를 직접 전달할 수는 없으므로 ID를 사용해야합니다. 분명히 팽창 된 뷰의 경우 컨테이너 뷰의 ID는 모든 부풀린 인터페이스에 대해 동일합니다. 그들은 모두 동일한 액티비티에 있기 때문에 트랜잭션은 발견 한 첫 번째 뷰 인스턴스를 선택합니다. 당신은 그것을 제어 할 수 없습니다. 따라서 MyFragment가 onCreate()를 호출하면 부모에 속하지 않는보기에 내부 조각이 추가 될 수 있습니다.

이것은 FragmentTransaction API의 문제입니다. 부모보기로 ID가 아닌 명시적인보기를 지정할 수 있다면 좋을 것입니다. 참조 : http://code.google.com/p/android/issues/detail?id=54051

어쨌든, 지금 해결 방법이 있습니다. onCreate 함수에서 컨테이너 ID를 수동으로 수정하기 만하면됩니다. 그런 다음 수정 된 ID를 add() 함수에 전달하십시오. 참고 : Programmatic Views how to set unique id's? (generateViewId() 함수 용).

Class MyFrag extends Fragment 
{ 
    public View onCreateView(LayoutInflater inflater, 
     ViewGroup container,Bundle savedInstanceState) 
    { 
     super.onCreateView(inflater, container, savedInstanceState); 
     .... 
     int containerID = generateViewId(); 
     infView.findViewById(R.id.frag_container).setId(containerID); 

     FragmentTransaction trans = getFragmentManager().beginTransaction(); 
     trans.add(containerID, new MyInternalF1, "InternalF1"); 
     trans.add(containerID, new MyInternalF2, "InternalF2"); 
     trans.commit(); 
     .... 
     return infView; 
    } 
}