2013-10-28 13 views
5

मुझे इन संदेशों में से एक टन StackOverflow में मिला। उन कई अन्य लोगों की तरह, टैब को स्विच करते समय टैब सामग्री ओवरलैपिंग के साथ मुझे एक ही समस्या है। मुझे मिली सलाह में से कोई भी मेरी समस्या के साथ काम नहीं करता था।एक्शनबार टैब सामग्री ओवरलैपिंग

जब मेरा ऐप लॉन्च होता है, तो यह सही टैब की सामग्री को सही ढंग से दिखाता है। जब मैं दूसरे टैब पर क्लिक करता हूं, तो पुरानी सामग्री स्क्रीन पर रहती है और अन्य टैब की सामग्री भी स्क्रीन पर जोड़ दी जाती है। दूसरी बार टैब स्विच करते समय, सभी सामग्री गायब हो जाती है। स्विचिंग टैब अब और भी नहीं करेंगे।

मैंने Google के डेवलपर दस्तावेज़ here का पालन किया।

मेरे आवेदन में यह onCreate विधि है .. कक्षा ActionBarActivity को libary android.support.v7.app समर्थन से बढ़ाती है।

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(false); 

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

    tab = actionBar.newTab().setText("TAB2").setTabListener(new TabListener<Tab2Class>(this, "tab2", Tab2Class.class)); 
    actionBar.addTab(tab); 
} 

मेरे TabListener वर्ग पेज मैं जुड़ा हुआ से नकल है:

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

    public TabListener(Activity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if(mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      ft.attach(mFragment); 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if(mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

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

दोनों वर्गों मैं टैब की सामग्री के रूप में उपयोग android.support.v4.app.Fragment से टुकड़ा का विस्तार। वे onCreateView विधियों में अपने लेआउट फुलाते हैं।

क्या गलत है?

उत्तर

7

क्या गलत है?

ActionBarActivity के लिए कोड पर एक संक्षिप्त दृष्टि के बाद, वहाँ जो भी का ख्याल रखता है ICS के लिए और ActionBar के कार्यान्वयन (कोड पूर्व ICS उपकरणों के लिए काम करना चाहिए) के हिस्से के ऊपर एक बग हो रहा है टैब

ActionBarImplICS वर्ग है जो यह FragmentTransactiononTabUnselected() कॉलबैक करने के लिए पारित कर दिया लगता है ICS उपकरणों के लिए कार्यान्वयन का प्रतिनिधित्व करता है में पूरी तरह से बेकार है, क्योंकि यह (लेन-देन के अन्य दो कॉलबैक के लिए प्रतिबद्ध है श्रोता के कॉलबैक रिटर्न के बाद कहीं भी प्रतिबद्ध नहीं है TabListener)। तो एक प्रतिबद्ध टुकड़ा कभी भी टैब चयन पर लेआउट से अलग नहीं किया जाएगा और यह ओवरलैपिंग सामग्री प्राप्त करेगा (FrameLayout के कारण जो दोनों टुकड़े रखता है)।

मैं TabListener इंटरफ़ेस जो कॉलबैक जो ऊपर बग से प्रभावित नहीं है का केवल एक से अपना काम करता है के सभी (onTabSelected()) का एक और कार्यान्वयन लिखा है:

public class TabListenerImpl implements ActionBar.TabListener { 

    private List<TabInfo> mTabs = new ArrayList<TabInfo>(); 
    private Context mContext; 

    public TabListenerImpl(Context context) { 
     mContext = context; 
    } 

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

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // iterate over all of the tabs, match the tag we have and see if 
     // we also have a fragment instance for it. If we don't, create one 
     // and add it to the container, if we have an instance simply attach 
     // it. Detach every other tag which doesn't match the tag. 
     for (TabInfo t : mTabs) { 
      if (tab.getTag() == t.tag) { 
       if (t.pageFragment == null) { 
        t.pageFragment = Fragment.instantiate(mContext, 
          t.clazz.getName()); 
        ft.add(android.R.id.content, t.pageFragment, t.tag); 
       } else { 
        ft.attach(t.pageFragment); 
       } 
      } else { 
       if (t.pageFragment != null && !t.pageFragment.isDetached()) { 
        ft.detach(t.pageFragment); 
       } 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // faulty method 
    } 

    /** 
    * Call this method BEFORE you call the actionBar.addTab() method! 
    * 
    * @param tag 
    *   a String representing the tag that was set on the tab to 
    *   identify itself 
    * @param clazz 
    *   the class of the Fragment 
    */ 
    public void addTab(String tag, Class<? extends Fragment> clazz) { 
     TabInfo ti = new TabInfo(); 
     ti.clazz = clazz; 
     ti.tag = tag; 
     mTabs.add(ti); 
    } 

    // wrapper class 
    private class TabInfo { 
     Class<? extends Fragment> clazz; 
     Fragment pageFragment; 
     String tag; 
    } 

} 

जो तुम तो कर सकते थे का उपयोग के रूप में:

TabListenerImpl listener = new TabListenerImpl(this); 
Tab tab = actionBar.newTab().setText("TAB1").setTag("TAB1").setTabListener(listener); 
listener.addTab("TAB1", Tab1Class.class); 
actionBar.addTab(tab); 

tab = actionBar.newTab().setText("TAB2").setTag("TAB2").setTabListener(listener); 
listener.addTab("TAB2", Tab2Class.class); 
actionBar.addTab(tab); 

मैं सामग्री दृश्य के रूप में एक कंटेनर सेट करने के लिए (टैब सामग्री के लिए और भी) आप सलाह देंगे और android.R.id.content कंटेनर का उपयोग नहीं। ध्यान रखें कि मेरा कार्यान्वयन कॉन्फ़िगरेशन परिवर्तनों का ख्याल नहीं रखता है।

+0

बहुत बढ़िया! मुझे समस्याओं का सामना करना पड़ा है क्योंकि मैं चाहता हूं कि एप्लिकेशन एपीआई 10 उपकरणों पर काम करे। मुझे आशा है कि लोग उन पुराने फोनों को कुचलने और एंड्रॉइड 4 के साथ नए प्राप्त करेंगे। बीटीडब्लू, क्या आप जानते हैं कि इन टैब का उपयोग करते समय मेरे एप्लिकेशन का शीर्षक क्यों नहीं है? या मेरा मेनू इन बिंदुओं में क्यों गिरता है, यहां तक ​​कि मेरे पास 'एंड्रॉइड है: showAsAction =" हमेशा "'? – MikkoP

+0

@MikkoP * क्या आप जानते हैं कि इन टैब का उपयोग करते समय मेरे एप्लिकेशन का शीर्षक क्यों नहीं है?* - यह तब होता है जब आप टैब का उपयोग करते हैं? और आप हमेशा 'actionBar.setTitle()' विधि का उपयोग कर सकते हैं। * या मेरा मेनू इन बिंदुओं में क्यों गिरता है, यहां तक ​​कि मेरे पास एंड्रॉइड है: showAsAction = "हमेशा"? * - क्या आपके पास ओवरफ्लो मेनू में मेनू आइटम हैं (पॉपअप जो 3 डॉट्स छवि पर क्लिक करते समय दिखाई देता है)? – Luksprog

+0

यह तब होता है जब मैं इन टैब का उपयोग करता हूं। 'actionBar.setTitle() 'कुछ भी नहीं बदलता है, न ही गतिविधि से' setTitle()' करता है। और हाँ, ये मेनू आइटम अतिप्रवाह मेनू में दिखाए जा रहे हैं। मैंने फिर से एक नया प्रश्न पोस्ट किया, इसलिए अगर कोई इसका उत्तर देता है, तो बेहतर संभावना है कि कुछ अन्य इसे ढूंढ सकें और मदद पा सकें। http://stackoverflow.com/questions/19660334/menu-collapsing-when-using-actionbar-tabs-for-navigation – MikkoP

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