2011-09-25 8 views
1

내 FragmentActivity는 tabhost 내에서 4 개의 listfragments를 관리합니다 (모든 목록 조각에 대해 나는 그 백 스택의 흔적을 유지합니다). ListFragment는 내용을 첨부하는 FrameLayout을 공유합니다. onListItemClick이 실행될 때 모든 ListFragment는 FragmentActivity가 새 Fragment를 시작하도록하여 현재 Fragment의 내용이 새 Fragment로 대체되도록합니다. A를 (ListFragment A가 관리하는) fragmetn이라고하고 B를 A (ListFragment B가 관리하는)를 대체 할 조각이 발생하면 A가 B의 내용과 겹치는 조각을 전환 할 때 적어도 B 나는 단편의 백 스택을 해제했다 (예제에서 A). 내가 OnListemItemClick 난 당신이 나에게 이유를 이해하는 데 도움이 시겠어요 조각 활동 및 조각 : popBackStack

private void replaceFragment(Fragment fragment, String tag, String backstack) { 

    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(R.id.mytabcontent, fragment, tag); 
    ft.setTransition(FragmentTransaction.TRANSIT_NONE); 
    ft.addToBackStack(backstack); 
    ft.commit(); 
} 

을 사용하여 발사 할 때 listfragment의 내용을 변경해야 할 경우 조각 사이 위하여 나는

if (activeTab != tv) { 
     if (activeTab != null) { 
      Log.i(TAG, "tag: " + activeTab.getTag() + " detaching..."); 
      FragmentInfo fragmentInfo = fragments.get(activeTab.getTag()); 
      //detach the current fragment 

      //getSupportFragmentManager().popBackStack((String)activeTab.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      ft.detach(fragmentInfo.fragment); 
     } 

     //get the new 
     FragmentInfo fragmentInfo = fragments.get(tv.getTag()); 
     Log.i(TAG, "tag: " + tv.getTag() + " fragment: " + fragmentInfo.mClass.getName()); 
     if (fragmentInfo != null) { 
      if (fragmentInfo.fragment == null) { 
       fragmentInfo.fragment = Fragment.instantiate(this, fragmentInfo.mClass.getName(), fragmentInfo._args); 
       ft.add(R.id.mytabcontent, fragmentInfo.fragment, fragmentInfo._tag); 
      } else { 
       Log.i(TAG, "attacching fragment: " + fragmentInfo.mClass.getName()); 
       ft.attach(fragmentInfo.fragment); 
      } 
     } 
    } 

동안합니까? 미리 감사드립니다 내 나쁜 영어에 대한 미안합니다

편집 : 제 질문은 왜 내가 조각 조각의 내용을 피하기 위해 ListFragment 사이를 전환 할 때마다 뒷받침을 취소해야합니다. 내가 잘못하고있는 것

+0

시도로 onTabUnselected ... 제가 질문을 이해하지 않았다 당신의 교체합니다. – Cristian

답변

5

Ok,이 대답은 탭을 바꿀 때마다 각 탭의 과거 기록을 지우려는 것으로 가정합니다. 그 말은 탭 1이 frag 1에서 시작한 다음 클릭하여 frag 2로 변경한다는 것을 의미합니다. 탭 2를 선택하면 탭 1의 기록을 실행 취소하고 다음에 탭 1을 클릭하면 되돌아갑니다. 여기 말했다와

파편 1. 솔루션입니다 : 조금 바꿔하기 위해 아래

public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      //this segment removes the back history of everything in the tab you are leaving so when you click on the tab again you go back to a fresh start 
      FragmentManager man = mActivity.getFragmentManager(); 
      if(man.getBackStackEntryCount()>0) //this check is required to prevent null point exceptions when clicking off of a tab with no history 
       man.popBackStack(man.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE); //this pops the stack back to index 0 so you can then detach and then later attach your initial fragment 
      //also it should be noted that if you do popbackstackimmediate here instead of just popbackstack you will see a flash as the gui changes back to the first fragment when the code executes 
      //end 
      ft.detach(mFragment); 
     } 
    }