2012-03-27 141 views
22

我注意到,在位置0的標籤項總是選擇的第一,然後在位置的標籤項x被加載。這意味着(因爲我使用碎片)2片段被加載。其中一人是沒有必要的......的Android動作條選項卡上設置最初選擇的選項卡

這裏是我的代碼:

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

    // Determine which bundle to use; either the saved instance or a bundle 
    // that has been passed in through an intent. 
    Bundle bundle = getIntent().getExtras(); 
    if (bundle == null) { 
     bundle = savedInstanceState; 
    } 

    // Initialize members with bundle or default values. 
    int position; 
    if (bundle != null) { 
     position = bundle.getInt("selected_tab"); 
    } else { 
     position = 0; 
    } 

    // Set the tabs. 
    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

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

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

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

    actionBar.setSelectedNavigationItem(position); 
} 

看來,在位置0的標籤在默認情況下最初選擇。但是,正如您所看到的,我正在傳遞包,以確保當再次運行onCreate()方法時仍然選擇最後選定的選項卡。

例如, 如果最後選定的標籤位於位置2,則onCreate()運行並且位置標籤爲0,然後加載位置2的標籤。

如何確保在使用actionBar.setSelectedNavigationItem(position)時,ActionBar不會選擇位置0處的選項卡。

回答

34

使用其他addTab調用來覆蓋此行爲。你需要先添加你想要選擇的標籤(在你的情況下,位置2的標籤)。 Relevant Javadoc

actionBar.addTab(tab2); 
actionBar.addTab(tab0, 0, false); 
actionBar.addTab(tab1, 1, false); 
+0

這很完美。我覺得有一個簡單的修復。謝謝。 – mdupls 2012-03-27 20:00:35

+0

它可以工作,但是當創建活動時,我可以看到ViewPager的轉換。有什麼辦法,如何禁用它? – sealskej 2012-12-06 15:28:40

+0

我不確定我是否有問題作者的相同問題。在我的情況下,函數setSelectedNavigationItem(...)時,我的Activity的onCreate調用片段實例化兩次或更多。爲此改變解決了我的問題。謝謝。 – 2013-01-09 16:39:12

3

您可以在activtiy使用下面statment 在onStart方法:

protected void onStart() { 
    super.onStart(); 
    actionBar.selectTab(mainTab); 
} 

這裏mainTab變量的類型是Tab。 這種方式需要定義的選項卡作爲類範圍的變量是這樣的:

Tab mainTab, tab2,tab3; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //add tabs to action bar 
    .... 
} 
2

如果有3個選項卡(即選項卡0,標籤1,標籤2),並希望標籤1被預選。這樣做:

for (int i = 0; i < mFragmentPagerAdapter.getCount(); i++) { 
    boolean preselected = (i == 1); 
    actionBar.addTab(actionBar.newTab().setText(
     mFragmentPagerAdapter.getPageTitle(i)).setTabListener(this), preselected); 
} 

您將使用:

public abstract void addTab (ActionBar.Tab tab, boolean setSelected) 

this API specification

0

bkurzius的回答幫助我解決了我遇到的同一問題。

我所做的是:

private final String TAB_SELECTED = "tab_selected" 
... 
private int mTabSelected; 
... 
mTabSelected = savedInstanceState.getInt(TAB_SELECTED); 
... 
final ActionBar actionbar = getActionBar(); 
... 
actionbar.addTab(tab1, mTabSelected == 0); 
actionbar.addTab(tab2, mTabSelected == 1); 
actionbar.addTab(tab3, mTabSelected == 2); 
... 
outState.putInt(TAB_SELECTED, getActionBar().getSelectedNavigationIndex()); 

這樣,的setSelected參數爲true只有mTabSelected等於選項卡的索引。

+0

你的mTabSelected應該是一個int而不是一個布爾值。 – mdupls 2014-04-03 16:58:44

+0

哎呀,深夜複製。這是一個整數。謝謝。編輯... – 2014-04-03 22:40:17

0

珀西Vega的答覆似乎是最好的工作解決方案。

for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 

     boolean preselected = (i == ErrorDetails.tab_id); 
     actionBar.addTab(
       actionBar.newTab() 
         .setText(mSectionsPagerAdapter.getPageTitle(i)) 
         .setTabListener(this),preselected); 
    } 
相關問題