7

स्वाइप करते समय टैब परिदृश्य में नहीं बदलेगा मेरे पास एक स्क्रीन है जो ViewPager + actionbar शेरलॉक टैब का उपयोग करती है। मैं पेजर पर एक setOnPageChangeListener सेट है और यह निम्नलिखित है:एक्शनबार शेरलॉक -

@Override 
public void onPageSelected(final int position) { 
    actionBar.setSelectedNavigationItem(position); 
} 

यह पोर्ट्रेट मोड में और यहां तक ​​कि परिदृश्य में अगर मैं केवल कुछ टैब है और सभी टैब प्रदर्शित किए जाते हैं बस ठीक काम करता है। हालांकि अगर मैं परिदृश्य में कुछ और टैब जोड़ता हूं, तो ये एक ड्रॉप-डाउन विजेट में पतन हो जाते हैं। जब मैं ViewPager के माध्यम से पृष्ठ setSelectedNavigationItem विधि निष्पादित किया जाता है लेकिन अब इसका ड्रॉप-डाउन चयन पर कोई प्रभाव नहीं पड़ता है: यह अंतिम चयनित मान पर रहता है। जो वास्तव में खराब है क्योंकि उपयोगकर्ता में दृश्य सुराग गुम है: टैब "वन" कह सकता है लेकिन उपयोगकर्ता पहले से ही पृष्ठ # 6 पर है।

क्या स्थिति के आधार पर प्रदर्शित करने के लिए प्रोग्राम को बदलने के लिए कोई तरीका है?

पीएस मैं जानता हूँ कि ऐसा क्यों होता है: यहाँ com.android.internal.app.ActionBarImpl से कोड है:

public void setSelectedNavigationItem(int position) { 
    switch (mActionView.getNavigationMode()) { 
    case NAVIGATION_MODE_TABS: 
     selectTab(mTabs.get(position)); 
     break; 
    case NAVIGATION_MODE_LIST: 
     mActionView.setDropdownSelectedPosition(position); 
     break; 
    default: 
     throw new IllegalStateException(
       "setSelectedNavigationIndex not valid for current navigation mode"); 
    } 
} 

और जब मुझे लगता है कि के माध्यम से कदम मैं देख सकता हूँ कि नेविगेशन मोड में अभी भी NAVIGATION_MODE_TABS है, हालांकि टैब सूची के रूप में प्रदर्शित कर रहे हैं। अब - मेरा घुटने झटका प्रतिक्रिया कोड को कोड में रखना है कॉन्फ़िगरेशन नेविगेशन मोड को उचित रूप से सेट करने के लिए बदल दिया गया है, लेकिन यह स्वचालित रूप से नहीं होना चाहिए?

पी.पी.एस. और वहाँ है Android bug इसके लिए दायर की पहले से ही है कि पैच

उत्तर

11

बेस (ActionBarImpl.java) फ़ाइल में ActionBarSherlock पुस्तकालय परियोजना में कुछ कोड जोड़ने की जरूरत में शामिल है प्रश्न (पीपीएस देखें) यहां कामकाज है जो वास्तव में काम करता है। बस इसे अपने पेजर

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() 
    { 
     @Override 
     public void onPageSelected(int position) 
     { 
      actionBar.getTabAt(position).select(); 
      ViewParent root = findViewById(android.R.id.content).getParent(); 
      findAndUpdateSpinner(root, position); 
     } 

     /** 
     * Searches the view hierarchy excluding the content view 
     * for a possible Spinner in the ActionBar. 
     * 
     * @param root The parent of the content view 
     * @param position The position that should be selected 
     * @return if the spinner was found and adjusted 
     */ 
     private boolean findAndUpdateSpinner(Object root, int position) 
     { 
      if (root instanceof android.widget.Spinner) 
      { 
       // Found the Spinner 
       Spinner spinner = (Spinner) root; 
       spinner.setSelection(position); 
       return true; 
      } 
      else if (root instanceof ViewGroup) 
      { 
       ViewGroup group = (ViewGroup) root; 
       if (group.getId() != android.R.id.content) 
       { 
       // Found a container that isn't the container holding our screen layout 
       for (int i = 0; i < group.getChildCount(); i++) 
       { 
        if (findAndUpdateSpinner(group.getChildAt(i), position)) 
        { 
         // Found and done searching the View tree 
         return true; 
        } 
       } 
       } 
      } 
      // Nothing found 
      return false; 
     } 
    }); 
+0

यह समाधान मूल एक्शनबार के लिए काम करता है लेकिन संगतता (एक जिंजरब्रेड एमुलेटर पर) के लिए काम नहीं करता है। यह कैसे तय किया जा सकता है? –

+0

धन्यवाद! यह निश्चित रूप से काम करता है :-) –

+0

धन्यवाद! अंततः एक कामकाजी समाधान मिला। – Ahmad

0

आप Android बग मैं में संदर्भित कर रहा हूँ पर देख this link

+0

जो फिक्स आपने इंगित किया है वह काम नहीं करता है, मैंने अभी इसे चेक किया है। कोड को केवल कॉन्फ़िगरेशन चेंग्ड से ही बुलाया जाता है और जब मुझे पृष्ठ से पृष्ठ – Bostone

+0

पर स्वाइप किया जाता है तो मुझे चयनित टैब बदलना पड़ता है यदि आप अपने श्रोता के अंदर से ViewPager का उपयोग कर रहे हैं तो आपको स्पष्ट टैब को स्पष्ट रूप से सेट करना होगा ... यही वह है जो मैं करता हूं मेरी परियोजना। – aProgrammer

संबंधित मुद्दे