2012-03-27 14 views
22

चयनित सेट मैं देखा है कि जब मेरी गतिविधि की विधि OnCreate() मेंएंड्रॉयड ActionBar टैब शुरू में टैब

actionBar.setSelectedNavigationItem(x) 

का उपयोग कर, स्थिति 0 पर टैब आइटम हमेशा पहले चुना गया है और स्थिति में फिर टैब आइटम एक्स लोड हो गया है। इसका मतलब है कि (चूंकि मैं टुकड़ों का उपयोग कर रहा हूं) 2 टुकड़े लोड हो गए हैं। उन्हें अनावश्यक होने का एक ...

यहाँ मेरी कोड है:

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 पर टैब डिफ़ॉल्ट रूप से शुरू में चुना गया है। लेकिन, जैसा कि आप देख सकते हैं, मैं यह सुनिश्चित करने के लिए बंडल पास कर रहा हूं कि अंतिम चयनित टैब अभी भी चुना गया है जब क्रिएट() विधि पर गतिविधि फिर से चलती है।

उदाहरण के लिए, यदि अंतिम चयनित टैब स्थिति 2 पर है, तो ऑनक्रेट() रन और स्थिति पर टैब 0 लोड होता है, फिर स्थिति 2 पर टैब लोड होता है।

मैं कैसे सुनिश्चित कर सकता हूं कि ActionBar actionBar.setSelectedNavigationItem (स्थिति) का उपयोग करते समय पहले स्थिति 0 पर टैब का चयन नहीं करता है।

उत्तर

34

इस व्यवहार को ओवरराइड करने के लिए अन्य addTab कॉल का उपयोग करें। आपको वह टैब जोड़ना होगा जिसे आप पहले चुना जाना चाहते हैं (आपके मामले में, स्थिति 2 पर टैब)। Relevant Javadoc

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

यह सही है। मैंने सोचा कि एक साधारण फिक्स था। धन्यवाद। – mdupls

+0

यह काम करता है, लेकिन जब गतिविधि बनाई जाती है तो मैं ViewPager के संक्रमण को देख सकता हूं। क्या कोई तरीका है, इसे कैसे अक्षम करें? – sealskej

+0

मुझे यकीन नहीं है कि मुझे प्रश्न के लेखक की एक ही समस्या है। मेरे मामले में फ़ंक्शन सेट सिलेक्टेड नेविगेशन इटिम (...) जब मेरी गतिविधि के क्रिएट पर कॉल किया गया तो टुकड़ा दो बार या उससे अधिक तत्काल था। इसके लिए मेरी समस्या हल करने के लिए बदल रहा है। धन्यवाद। –

18

किसी भी ऐसा करने के लिए देख दूसरों के लिए आप भी टैब स्थिति की स्थापना द्वारा चयनित और उसके बाद सही या गलत संकेत मिलता है जो टैब का चयन किया जाना चाहिए सेट करने के लिए सेट कर सकते हैं

actionBar.addTab(tab1, 0, false); 
actionBar.addTab(tab2, 1, true); 
actionBar.addTab(tab3, 2, false); 

यहाँ कर रहे हैं इस दृष्टिकोण पर डॉक्स: http://developer.android.com/reference/android/app/ActionBar.html#addTab(android.app.ActionBar.Tab, int, boolean)

3

आप activtiy में बयान नीचे का उपयोग कर सकते onStart विधि:

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

जो mainTab वैरिएबल यहां टैब प्रकार का है। इस तरह से आप इस तरह वर्ग चौड़ा चर के रूप में टैब परिभाषित करने की जरूरत:

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 पैरामीटर सच है ही अगर mTabSelected टैब के सूचकांक के बराबर है।

+0

आपका एमटीएबी चयनित एक int और बूलियन नहीं होना चाहिए। – mdupls

+0

ओह, देर रात की प्रतिलिपि। यह एक int है। धन्यवाद। संपादन... –

0

पर्सी वेगा का जवाब सबसे अच्छा काम करने वाला समाधान प्रतीत होता है।

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); 
    } 
संबंधित मुद्दे