2013-12-07 80 views
0

我有一個android應用程序,我在NAVIGATION_MODE_TABS模式下使用ActionBar。ActionBar Android

目前,我大量使用碎片。所以,對於顯示的選項卡來說工作得很好。我正面臨一個設計問題,我認爲我的方向是錯誤的。

MainActivity有三個選項卡。特別是一個選項卡上有一堆導航。

MainActivity

  • TAB1
  • TAB2
  • TAB3(這有應顯示基於用戶點擊了哪些不同的片段按鈕)

要求是保持標籤總是可以看到相同的文字。所以,我最終創建了一系列活動,這些活動從MainActivity繼承,我根據用戶點擊的內容製作了第三個標籤內容。

這使我能夠保持內容流暢,並保持外觀一致。但是,創建活動似乎是一種開銷。

我試圖利用FragmentManager和pushToStack。然而,這條路線似乎並不奏效。

我靠這個接口ActionBar.TabListener要正確安裝,當用戶點擊選項卡上的分離基於片段。那很好。然而,我介紹一個看起來有問題的不同片段。

希望這很清楚,我正在尋找最好的建議。

我解決它通過依靠以下邏輯:

public class FragmentTabListener implements ActionBar.TabListener 
{ 
    private String _fragmentClassName; 
    private Context _context; 
    private Fragment _fragment; 
    private Boolean _cleanStack = true; 

    public FragmentTabListener(Context context, String fragmentClassName, 
      Boolean cleanStack) 
    { 
     _context = context; 
     _fragmentClassName = fragmentClassName; 
     _cleanStack = cleanStack; 

    } 

    public FragmentTabListener(Context context, String fragmentClassName) 
    { 
     this(context, fragmentClassName, false); 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) 
    { 
     cleanFragmentManagerStack(); 
     if (this._cleanStack) 
     { 
      ft.attach(_fragment); 
     } 
    } 

    private void cleanFragmentManagerStack() 
    { 
     if (this._cleanStack) 
     { 
      FragmentManager mgr = ((Activity) _context).getFragmentManager(); 
      int backStackCount = mgr.getBackStackEntryCount(); 
      for (int i = 0; i < backStackCount; i++) 
      { 
       // Get the back stack fragment id. 
       int backStackId = mgr.getBackStackEntryAt(i).getId(); 

       mgr.popBackStack(backStackId, 
         FragmentManager.POP_BACK_STACK_INCLUSIVE); 
      } 
     } 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) 
    { 
     if (_fragment == null) 
     { 
      _fragment = Fragment.instantiate(_context, _fragmentClassName); 
      ft.add(android.R.id.content, _fragment); 
     } 
     else 
     { 
      ft.attach(_fragment); 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) 
    { 
     this.cleanFragmentManagerStack(); 
     // TODO Auto-generated method stub 
     ft.detach(_fragment); 

    } 

} 

對我原先的片段的任何行動,我被添加到片段當前堆棧。

這工作。希望它能幫助別人。

回答

0

根據我的理解,您需要3個片段,每個片段在一個選項卡中,並且在第3個選項卡中,您可以在片段內部基於用戶單擊的內容, )。也許我沒有正確理解你的問題,如果是這種情況告訴我。

乾杯!

+0

感謝您的建議。如果它在支持庫中受支持,我正在查看它。我不想將自己鎖定在更新的API中,這樣我可以讓應用程序適用於較舊的模型。 謝謝, – Sam

+0

我使用的支持庫也爲類似的事情。實際上,據我所知,你只能在ViewPager中使用支持片段。 – Ciprian