2012-02-26 92 views
4

參考以下代碼(取自https://gist.github.com/1126843)我如何設置標籤的內容?使用actionbarsherlock標籤樣式的標籤內容

public class NativeTabActivity extends Activity { 
    private TabHost mTabHost; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(); 

     addTab(new TextView(this), "Tab 1"); 
     addTab(new TextView(this), "Tab 2"); 
     addTab(new TextView(this), "Tab 3"); 
    } 

    private void addTab(final View content, final String title) { 
     View tabView = LayoutInflater.from(this).inflate(R.layout.abs__action_bar_tab_layout, null); 
     TextView tv = (TextView) tabView.findViewById(R.id.abs__tab); 
     tv.setText(title); 

     TabSpec setContent = mTabHost.newTabSpec(title).setIndicator(tabView).setContent(new TabContentFactory() { 
      public View createTabContent(String tag) { 
       return content; 
      } 
     }); 
     mTabHost.addTab(setContent); 
    } 
} 

從代碼,看來我需要把內容的視圖createTabContent(字符串標籤)下,但我怎麼辦呢?

回答

8

我爲我的Sherlock實現使用Fragments。

public class ActionBarTabs extends FragmentActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 

    bar.addTab(bar.newTab() 
      .setText("Home") 
      .setTabListener(new TabListener<DashBoardFragment>(
        this, "home", DashBoardFragment.class, null))); 

    bar.addTab(bar.newTab() 
      .setText("Inventory") 
      .setTabListener(new TabListener<InventoryFragment>(
        this, "inventory", InventoryFragment.class, null))); 

if (savedInstanceState != null) { 

     bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0)); 
    } 


} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      // app icon in action bar clicked; go Location selection 
      Intent intent = new Intent(ActionBarTabs.this, LocationSelectorActivity.class); 
      ActionBarTabs.this.startActivityForResult(intent,0); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

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

public class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 




    public TabListener(FragmentActivity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 


     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      ft.detach(mFragment); 
     } 
    } 

    @Override 
    public void onTabSelected(Tab tab) { 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 

     if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
      ft.commit(); 
     } else { 
      ft.attach(mFragment); 
      ft.commit(); 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab) { 
     FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction(); 

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

    @Override 
    public void onTabReselected(Tab tab) { 

    } 

} 

} 

的關鍵變化不同片段裝入標籤是簡單地改變「YOUR_FRAGMENT_NAME」你的片段類的名稱在這些行:

bar.addTab(bar.newTab() 
      .setText("Home") 
      .setTabListener(new TabListener<YOUR_FRAGMENT_NAME>(
        this, "home", YOUR_FRAGMENT_NAME.class, null))); 

希望這有助於!

14

我發現Rymnel的答案非常有幫助,但我不得不做一些更改以使其與ActionBarSherlock 4.0正常工作。我在覆蓋傳遞給FragmentTransactions的onTab方法時遇到了問題,所以我只使用了默認方法,並在方法內重新分配了「ft」var。我確信有一個更乾淨的方式來做到這一點,但這裏是我的工作代碼:

public class TabTestActivity extends SherlockFragmentActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getSupportActionBar(); 
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 
    bar.setDisplayHomeAsUpEnabled(true); 
    bar.setDisplayShowTitleEnabled(true); 
    bar.setTitle("Activity Title"); 
    bar.addTab(bar 
      .newTab() 
      .setText("Tab 1") 
      .setTabListener(
        new TabListener<TabTest1>(this, "tab1", 
          TabTest1.class, null))); 

    bar.addTab(bar 
      .newTab() 
      .setText("Tab 2") 
      .setTabListener(
        new TabListener<TabTest2>(this, "tab2", 
          TabTest2.class, null))); 
    bar.addTab(bar 
      .newTab() 
      .setText("Tab 3") 
      .setTabListener(new TabListener<TabTest3>(this, "tab3", TabTest3.class, null))); 

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

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     // app icon in action bar clicked; go home 
        Intent intent = new Intent(this, DashboardActivity.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(intent); 
        return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

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

public class TabListener<T extends Fragment> implements 
     ActionBar.TabListener { 
    private final FragmentActivity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 

    public TabListener(FragmentActivity activity, String tag, Class<T> clz, 
      Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 
     FragmentTransaction ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getSupportFragmentManager() 
       .findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      ft.detach(mFragment); 
     } 
    } 


    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

     if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), 
        mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
      ft.commit(); 
     } else { 
      ft.attach(mFragment); 
      ft.commit(); 
     } 

    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     ft = mActivity.getSupportFragmentManager() 
       .beginTransaction(); 

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

    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 
}