2012-10-01 11 views
6

मुझे टैब स्वाइप के संबंध में एक समस्या का सामना करना पड़ रहा है। मेरा प्रोजेक्ट एंड्रॉइड 3.2 पर बनाया गया है। मैं समर्थन लाइब्रेरी 4.0 (एंड्रॉइड-सपोर्ट-v4.jar) का उपयोग कर टैब स्वाइप लागू कर रहा हूं। लागू सबकुछ ठीक काम कर रहा है लेकिन जब मैं अपने ऐप को आईसीएस डिवाइस पर तैनात करता हूं, तो पोर्ट्रेट मोड में मुझे टैब चयन के लिए एक्शन बार में स्पिनर मिल रहा है। पोर्ट्रेट मोड में, स्वाइप पूरा होने पर टैब चयन नहीं बदल रहा है हालांकि सामग्री बदल रही है, और सब कुछ लैंडस्केप मोड में ठीक काम कर रहा है।एक्शन बार टैब में चयनित खंड कैसे दिखाएं

final ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayHomeAsUpEnabled(true); 
// Set up the ViewPager with the sections adapter. 
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

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

}); 

मैं इस लाइन पर ब्रेकप्वाइंट actionBar.setSelectedNavigationItem(position); डालने की कोशिश की है और यहां तक ​​कि पोर्ट्रेट मोड पर यह कहा जाता हो रही है, लेकिन चयन नहीं बदल रहा है।

क्या कोई इस से मदद कर सकता है?

संपादित: मिले एक similar problem लेकिन नहीं दिख रहा है वास्तव में कैसे इसे हल किया जाता है और कैसे मेरे कोड में एकीकृत करने के लिए।

+0

मैं यह मेरा नमूने में काम करता है लगता है भेजा ओरिएंटेशन में लगातार टैब के लिए एक्शन बार टैब से 'पेजरटैबस्ट्रिप' या व्यूपेगर इंडिकेटर के टैब स्वाद पर स्विचिंग: https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/Indicator – CommonsWare

+0

उत्तर के लिए धन्यवाद, मैं लिंक देखें, और मुझे केवल टैब स्वाइप का उपयोग करने की आवश्यकता है लेकिन सुझाव के लिए धन्यवाद। मैं पेजरटैबस्ट्रिप को लागू करने का प्रयास करूंगा और देख सकता हूं कि यह बेहतर है या नहीं। – Android

उत्तर

16

समस्या: एक अपर्याप्त वास्तविक राज्य के कारण मंच ढह नेविगेशन (अर्थात स्पिनर) का उपयोग करता है। सिस्टम लैंडस्केप के लिए & NAVIGATION_MODE_LIST के लिए NAVIGATION_MODE_TABS को स्वतः निर्धारित करता है, लैंडस्केप से पोर्ट्रेट से अभिविन्यास को बदलता है, यूआई अपडेट करता है लेकिन किसी कारण से नेविगेशन मोड प्रॉपर्टी को NAVIGATION_MODE_LIST पर अपडेट नहीं किया जाता है और इसलिए mActionView.setDropdownSelectedPosition (position) को नहीं कहा जाता है। ActionBarImpl के निम्नलिखित कोड देखें: setSelectedNavigationItem

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"); 
    } 
} 

वर्कअराउंड समाधान: प्रतिबिंब के माध्यम से हम टैब स्पिनर वस्तु हो और setSelection विधि कॉल कर सकते हैं।

private Spinner getTabSpinner() 
{ 
    try 
    { 
     int id = getResources().getIdentifier("action_bar", "id", "android"); 
     View actionBarView = findViewById(id); 

     Class<?> actionBarViewClass = actionBarView.getClass(); 
     Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView"); 
     mTabScrollViewField.setAccessible(true); 

     Object mTabScrollView = mTabScrollViewField.get(actionBarView); 
     if (mTabScrollView == null) { 
      return null; 
     } 

     Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner"); 
     mTabSpinnerField.setAccessible(true); 

     Object mTabSpinner = mTabSpinnerField.get(mTabScrollView); 
     if (mTabSpinner != null) 
     { 
      return (Spinner)mTabSpinner; 
     } 
    } 
    catch (Exception e) { 
     return null; 
    } 

    return null; 
} 

फिर उपर्युक्त विधि को पेज पर चयनित ईवेंट में कॉल करें। https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/TabPager हालांकि, मैं सिफारिश करेंगे आप समझते हैं:

 public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
      Spinner spinner = getTabSpinner(); 
      if (spinner != null) { 
       spinner.setSelection(position); 
      } 
     } 

इस पोस्ट https://gist.github.com/2657485

+0

अरे बहुत सारे thnx Wayofhope। मैं आपके उदाहरण के माध्यम से जाऊंगा और आपको प्रगति की जानकारी दूंगा। – Android

+0

आशा की अरे धन्यवाद रास्ता। यह शानदार ढंग से काम कर रहा है। मेरी 5 दिन की समस्या हल हो गई। धन्यवाद। – Android

+0

ग्रेट !!! दोस्त का आनंद लें –