2012-05-08 6 views
20

ActionBarSherlock을 사용하는 앱을 만들고 있습니다. 이 앱은 3 개의 탭으로 구성되어 있으며 각 탭에는 사용자 입력에 따라 여러 개의 화면이 연속적으로 표시됩니다. 탭 사이에서 조각을 전환 할 수 있지만 내의 탭 조각 전환에 문제가 있습니다. 나는이처럼 시도했다 :탭 내 조각 전환

SingleStationFragment singleStationFragment = new SingleStationFragment(); 
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(android.R.id.content, singleStationFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

두 번째의 첫번째 조각을 대체 않지만, 내가 탭을 변경할 때, 두 번째 조각이 보여, 여전히 볼 수 있습니다 : 메인 클래스에서

에게 이전 탭의 내용 위에 새 탭의 내용 어떻게 든 두 번째 조각을 onTabUnselected에서 분리해야한다고 생각하지만이 조각에 대한 참조를 얻는 방법을 모릅니다.

아무도 도와 줄 수 있습니까?

명확성을 위해

, 몇 가지 중요한 클래스 :

내 주요 클래스 : (약간의 변경 "Adding Navigations Tabs" on the Android developer site에서)

public class TreinVerkeer extends SherlockFragmentActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setupTabs(savedInstanceState); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.menu, menu); 
     return true; 
    } 

    private void setupTabs(Bundle savedInstanceState) { 
     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     Tab tab = actionBar.newTab().setText("STATIONS").setTabListener(new TabListener<StationsFragment>(this, "stations", StationsFragment.class)); 
     actionBar.addTab(tab); 

     tab = actionBar.newTab().setText("ROUTE").setTabListener(new TabListener<RouteFragment>(this, "route", RouteFragment.class)); 
     actionBar.addTab(tab); 

     tab = actionBar.newTab().setText("DELAYS").setTabListener(new TabListener<DelaysFragment>(this, "delays", DelaysFragment.class)); 
     actionBar.addTab(tab); 

     if (savedInstanceState != null) { 
      actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("tab", getSupportActionBar().getSelectedNavigationIndex()); 
    } 
} 

TabListener :

public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { 
    private SherlockFragment mFragment; 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    /** 
    * Constructor used each time a new tab is created. 
    * 
    * @param activity 
    *   The host Activity, used to instantiate the fragment 
    * @param tag 
    *   The identifier tag for the fragment 
    * @param clz 
    *   The fragment's Class, used to instantiate the fragment 
    */ 
    public TabListener(Activity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    /* The following are each of the ActionBar.TabListener callbacks */ 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 

    // Check if the fragment is already initialized 
    if (mFragment == null && preInitializedFragment == null) { 
     // If not, instantiate and add it to the activity 
     mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); 
     ft.add(android.R.id.content, mFragment, mTag); 
    } else if (mFragment != null) { 
     // If it exists, simply attach it in order to show it 
     ft.attach(mFragment); 
    } else if (preInitializedFragment != null) { 
     ft.attach(preInitializedFragment); 
     mFragment = preInitializedFragment; 
    } 
} 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      // Detach the fragment, because another one is being attached 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // User selected the already selected tab. Usually do nothing. 
    } 
} 

그리고 StationsFragment (RouteFragmentDelaysFragment 다른 텍스트 만 사용)

public class StationsFragment extends SherlockFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.stationsfragment, container, false); 
    } 
} 

답변

24

그래서 무슨 일이 있었 TabListener에서 onTabUnselected 방법에서는 Fragment이 새로운 Fragment가 표시되는 동안 여전히 쇼로 원인이 분리되지 않았다이었다.

이 원인은 분리 된 Fragment이 첫 번째 조각이었고 두 번째 조각이 아니었기 때문입니다. 나는 약간의 변화를 만들었다. Activity에서

: I가 제 단편과 동일한 태그이다 replace() 방법에 "STATIONS" 태그를 추가 한 다음

SingleStationFragment singleStationFragment = new SingleStationFragment(); 
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
transaction.replace(android.R.id.content, singleStationFragment, "STATIONS"); 
transaction.addToBackStack(null); 
transaction.commit(); 

. 다음
TabListener 해주기이다

public class TabListener<T extends SherlockFragment> implements com.actionbarsherlock.app.ActionBar.TabListener { 
    private final SherlockFragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    private SherlockFragment mFragment; 

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     if (preInitializedFragment == null) { 
      mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName()); 
      ft.add(R.id.treinverkeer_fragmentcontent, mFragment, mTag); 
     } else { 
      ft.attach(preInitializedFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 

     if (preInitializedFragment != null) { 
      ft.detach(preInitializedFragment); 
     } else if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     // User selected the already selected tab. Usually do nothing. 
    } 
} 

onTabUnselected 방법 I은 이제 제 다음 분리 올바른 Fragment 검색.

희망이 있으면 도움이됩니다.

+2

감사합니다. 도움이 되었어요. – NotCamelCase

+0

제게 약간의 코드를 보내 주시겠습니까? 이것은 제가하려고하는 것입니다. – user1730789

+0

+1 그게 정말 잘 고마워 :)! – AgentKnopf