3

ActionBar 탭인 as illustrated here과 함께 ViewPager를 사용하고 있습니다. 이전 버전과의 호환성을 위해 ActionBarSherlock을 사용하고 있으므로 부모 작업이 SherlockFragmentActivity를 확장하고 자식 조각이 SherlockFragment를 확장합니다.ViewPager에서 프래그먼트를 TabsAdapter로 동적으로 대체

이 솔루션은 스 와이프를 사용하여 탭에 잘 작동하지만 이제는 탭 중 하나와 연결된 조각을 동적으로 변경하려고합니다.

나는 수많은 S.O. (예 : herehere)이 주제에 대한 답을 찾았지만 위의 TabsAdapter + ViewPager를 사용할 때 조각을 동적으로 변경하는 방법에 대한 명확한 설명을 찾지 못했습니다.

다음은 현재 가지고있는 내용입니다.

AnotherFragment fragment = new AnotherFragment();   
FragmentManager fm = getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 

int viewId = R.id.pager;     // resource id of the ViewPager 
int position = Constants.TAB_2;   // tab pos of the fragment to be changed 

String tag = "android:switcher:" + viewId + ":" + position; 

ft.replace(viewId, fragment, tag); 
ft.commit(); 

mTabsAdapter.notifyDataSetChanged(); 

이 작동하지 않는, 그래서 내가 뭔가를 누락 : 사용자가 기존의 단편에 단추를 명중 할 때, 나는 다음과 같이 부모 활동에서 조각을 교체하려고합니다. 또한 getChildFragmentManager()를 사용하여 중첩 된 조각으로 처리하려고 시도했지만 API 17, Android 4.2 없이는이 함수를 사용할 수 없으므로 문제가 발생했습니다.

도움 주셔서 감사합니다.

+0

하나의 실수가의 리소스 ID를 사용하고 있었던 것 같습니다 ViewPager, R.id.pager. 이것을 대상 단편 레이아웃의 ID로 전환 했으므로 새 단편을 볼 수 있습니다. 그러나 이전 조각이 탭에 계속 표시됩니다. 이것이 올바른 방향으로 가고 있습니까? 아니면 다른 것을 시도해야합니까? – gcl1

+1

업데이트 : http://stackoverflow.com/questions/7723964/replace-fragment-inside-a-viewpager/에 대한 답변으로 @georgiecasey에서 권장하는대로 getChildFragmentManager()를 사용할 수 있도록 API 17 (Android 4.2)로 업그레이드했습니다. 13925130 # 13925130. 그러나 오래된 조각과 새 조각이 동시에 탭에 표시되게하는 느슨한 끝이 있습니다. http://developer.android.com/reference/android/support/v4/view/ViewPager.html에서 Google TabsAdapter를 사용하여 중첩 된 조각을 사용하는 방법을 보여주는 참조 코드를 가장 좋아할 것입니다. 감사. – gcl1

+0

어댑터 코드도 게시 할 수 있습니까? –

답변

1

비슷한 동작을 보이는 약간의 예를 만들었습니다. 당신이 그것을 재사용 할 수 있기를 바랍니다.

핵심은 컨테이너로 조각을 사용하고이를 사용하여 "실제"조각을 대체하는 것입니다.

예를 들어, 다른 조각을 탐색하는 방법을 참조하십시오

 btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      FragmentTransaction trans = getFragmentManager() 
        .beginTransaction(); 
      /* 
      * IMPORTANT: We use the "root frame" defined in 
      * "root_fragment.xml" as the reference to replace fragment 
      */ 
      trans.replace(R.id.root_frame, new SecondFragment()); 

      /* 
      * IMPORTANT: The following lines allow us to add the fragment 
      * to the stack and return to it later, by pressing back 
      */ 
      trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
      trans.addToBackStack(null); 

      trans.commit(); 
     } 
    }); 

당신은 여기에 전체 예를 확인할 수 있습니다

https://github.com/danilao/fragments-viewpager-example

+1

[링크 전용 답변은 권장하지 않습니다.] (http://meta.stackoverflow.com/tags/link-only-answers/info) SO 답변은 솔루션 검색의 종점이어야합니다 (시간이 지남에 따라 부실 해지는 경향이있는 참조의 또 다른 중간 기착). 링크를 참조 용으로 유지하면서 독립형 시놉시스를 여기에 추가하는 것을 고려해보십시오. – kleopatra

관련 문제