2014-06-23 4 views
0

내가 XML 이런 식으로 뭔가를 포함하는 조각을 가지고를 제거합니다. 부모 조각은 다음과 같이 시작합니다.는 모든 자식의 파편

getFragmentManager().beginTransaction() 
      .replace(R.id.frameContainer, myFragment1) 
      .addToBackStack(null) 
      .commit(); 

이렇게 조각이 1 번 이상 표시 될 때까지 모든 작업이 정상적으로 작동합니다. 나는 다시 클릭 한 다음 나는이 잘못을 받고 있어요, 다시 조각을 열려고하는 경우 :

Caused by: java.lang.IllegalArgumentException: Binary XML file line #17: Duplicate id 0x7f080130, tag null, or parent id 0xffffffff with another fragment for com...widgets.myViewPager 

을 나는이 문제를 알고도 해결책을 가지고 있습니다. 나는 onDestroy에서 단편을 제거 할 수있었습니다. 그러나, 나는 이것을하고 싶지 않다! 다른 조각을 포함하는 xml은 동적입니다. 번들을 통해 레이아웃을 얻고 있습니다. 따라서이 부분에서는 어떤 조각이 표시되는지 알 수 없습니다. 그리고이 부분을 한 번 이상 사용하면 이름이 동일하다는 것을 확실하게해야합니다. 그래서 내 질문은 : 각 조각에서 제거 할 수있는 가능성이 있습니까? 그래서 모든 조각이 자신을 제거하고 부모는 할 일이 없습니까? 도움을

감사

편집 :

MyFragment myFragment1 = new MyFragment(); 

    Bundle bundle = new Bundle(); 
    bundle.putInt("layout",R.layout.my_fragment); 
    myFragment1.setArguments(bundle); 

    getFragmentManager().beginTransaction() 
      .replace(R.id.frameContainer, myFragment1) 
      .addToBackStack(null) 
      .commit(); 

내가 다른 곳에서하고있어이 호출. 각 호출에 대해 다른 조각으로 XML을 만들 수 있습니까? 부모님 조각에 나는이 일을 해요 그리고 :

int layoutId = this.getArguments().getInt("layout", 0); 
    if(layoutId==0) 
     throw new RuntimeException("LayoutId not found"); 

    return inflater.inflate(layoutId,container,false); 

을 그 일을 한 후, 내 조각 나는 XML에 설정된 모든 조각과 XML을로드합니다. 그래서 외부에서 뷰를 정의 할 수 있습니다. 이 조각에서 파기하고 다시 열면 오류가 발생합니다. 이것은 내 XML의 모든 조각이 파괴되지 않았기 때문입니다! 부모님이 모르는 부분은 xml에있는 파편이 무엇인지 모르기 때문에 수업에서 자신을 파괴하고 싶습니다.

+0

여기까지 도달 했습니까? –

답변

2

이 오류는 자식 Fragment이 (가) 프로그래밍 방식으로 표시되는 &으로 만 생성 될 수 있기 때문에 발생합니다. Fragment의 XML 레이아웃에는 <fragment ... /> 태그를 사용할 수 없습니다. docs에서 :

1 단계 : 다음과 같이 부모 Fragment의 XML 레이아웃을 수정 : 여기

You cannot inflate a layout into a fragment when that layout includes a <fragment>. Nested fragments are only supported when added to a fragment dynamically.

당신이해야 할 무엇

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="230dp"> 

    <!-- <fragment 
     android:id="@+id/myFragmen1" 
     android:name="com...widgets.myViewPager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> --> 

    <FrameLayout 
     android:id="@+android:id/childfragmentregion" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="0dp" 
     android:layout_weight="1" > 
    </FrameLayout> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/text""/> 

</RelativeLayout> 

STEP 2 : 그런 다음 새 하위 조각을 교환하는 경우 :

FragmentManager fm = getChildFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.childfragmentregion, new SomeXYZFragment(), "some_xyz_fragment"); 
ft.commit(); 

3 단계 : 다음과 같이 부모 FragmentonDetach() 메서드를 재정의 :

@Override 
public void onDetach() { 
    super.onDetach(); 

    try { 
     Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 

    } catch (NoSuchFieldException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 

이 예외없이 작동합니다. 질문의 두 번째 부분을 명확히하기를 요청합니다. FragmentBundle에 들어가는 것이 확실하지 않습니다.좀 더 명확하게한다면 당신을 도울 수 있습니다.

+0

도움을 주셔서 감사합니다. 그러나 이것이 도움이되지 않을 것이라고 생각합니다. 어쩌면 내가 좀 더 설명해야합니다 : 2 Textviews 같은 간단한 내용이 들어있는 4 조각, 있습니다 ... 다음 메모, 한 주석에 대해 너무 깁니다 :) – user3621165

+0

이제 XML을 만들 필요가 있습니다. 여기에는 필요한 조각이 들어 있습니다. 내가 조각을 보여줄 곳과는 다른 곳을 가지고 있기 때문에 나는 이렇게하고있다. 그러나 다른 내용을 가지고있다. 그래서 나는 조각들로 xml을 만들고이 xml을 묶음에 넣습니다. 시작시 조각은 xml을 다른 조각으로로드합니다. 따라서 외부에서 뷰의 내용을 처리 할 수는 있지만 표시해야하는 데이터는 신경 쓸 필요가 없습니다. – user3621165

+0

나는 오류의 원인을 지적했다. 나는 정확하다고 믿는다. 그리고 나는 xml을 묶음으로 넣는 것의 의미를 이해하지 못합니다. 당신이 의미하는 바는,'Bundle'에서 자식'Fragment's에있는'TextView'의 문자열 * value *를 전달한다는 것입니다. –