2016-05-14 12 views
7

पर टूटा हुआ मैं अपने व्यूअरजर में टैबलेट सेट कर रहा हूं। लेकिन जब मैं notifyDataSetChanged तो का उपयोग यह मेरी customview को दूर करने और डिफ़ॉल्ट शीर्षक दृश्य मेरी कोड दिखाकस्टम दृश्य के साथ टैबलेटआउट 23.4.0 डिज़ाइन lib

ViewPager viewPager = findView(R.id.view_pager); 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), getResources(), getFragments()); 
    viewPager.setAdapter(adapter); 

    tabs.setupWithViewPager(viewPager); 
    for (int i = 0; i < tabs.getTabCount(); i++) { 
     TabLayout.Tab tab = tabs.getTabAt(i); 
     tab.setCustomView(getTabView(i)); 

    } 
    t.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      adapter.notifyDataSetChanged(); 
     } 
    }); 


    public View getTabView(int position) { 
    View v = LayoutInflater.from(this).inflate(R.layout.pager_tab, null); 
    RelativeLayout linearLayout = (RelativeLayout) v.findViewById(R.id.view); 



    return v; 
} 

इसलिए इसकी ठीक से काम कर, लेकिन जब मैं adapter.notifyDataSetChanged फोन(); तो मेरा टैबलेटआउट कस्टमव्यू नहीं दिखा रहा है जिसे मैंने पहले ही जोड़ दिया है। यह केवल डिफ़ॉल्ट शीर्षक .. यह एक ही कोड काम कर रहा है दिखा अगर मैं संकलन "com.android.support:design:23.1.1"

लेकिन अगर मैं नए संस्करण के लिए इसे बदल यह कृपया कर सकते हैं किसी भी काम नहीं कर रहा का उपयोग एक मेरी मदद करता है कि मैं इसे कोशिश कर रहा हूं लेकिन मुझे जवाब या कोई अन्य वैकल्पिक lib या विधि नहीं मिला है जहां मैं टैब व्यू में कस्टम व्यू जोड़ सकता हूं

उत्तर

1

मुझे लगता है कि मुझे एक प्रकार का समाधान मिला: लेआउट परिवर्तन सुनें, और यदि कस्टम व्यू शून्य है, तो सेट करें यह फिर से:

viewPager.addOnLayoutChangeListener(new ViewPager.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     for (int i = 0; i < tabLayout.getTabCount(); i++) { 
      if (tabLayout.getTabAt(i).getCustomView() == null) { 
       tabLayout.getTabAt(i).setCustomView(tabs[i]); 
      } 
     } 
    } 
} 
+0

लेकिन हर बार दृश्य जोड़ने सही है? और पिछला दृश्य हटाया नहीं गया है – andro

0

मुझे एक ही समस्या का सामना करना पड़ रहा था, और मैं इसेसेट करके ठीक करता हूंसेटअप करते समय (मैं वर्तमान में संस्करण 24.1.0 का उपयोग कर रहा हूं)।

अधिक विस्तृत के लिए, ईमानदारी से मैं केवल टैबलाउट क्लास पर एक नज़र डालता हूं और महसूस करता हूं कि टैब को हटाए गए कॉल पेजर एडाप्टर ऑब्सर्वर से आया था। वह तब सेट होता है जब autoRefresh सही चुड़ैल TabLayout.setupWithViewPager(ViewPager viewPager) का डिफ़ॉल्ट मान है।

फिर प्रलेखन पर शीघ्रता से अवलोकन कहते हैं:

तो autorefresh सच है, PagerAdapter में कोई परिवर्तन ही एडाप्टर के खिताब से फिर से पॉप्युलेट करने के लिए इस लेआउट ट्रिगर किया जाएगा।

तो या तो प्रलेखन कह रही है कि autoRefresh कस्टम दृश्य के लिए झूठी होना चाहिए अद्यतन किया जाना चाहिए या वे कस्टम दृश्य की देखभाल करने में विफल रहा।

https://developer.android.com/reference/android/support/design/widget/TabLayout.html#setupWithViewPager(android.support.v4.view.ViewPager, boolean)

+0

इसे गलत पर सेट करने का प्रयास किया लेकिन फिर भी वही परिणाम प्राप्त करें :( मुझे केवल यह समस्या तब मिलती है जब मैंने संस्करण 22 से 25 – vida

1

जब टैब बनाया या निर्मित कर रहे हैं कस्टम दृश्य सेट करने के लिए, हम एक कॉलबैक की जरूरत है जब ऐसा होगा।
कक्षा TabLayout इस मामले में श्रोता को बुलाए जाने की अनुमति नहीं देता है लेकिन यह विधि TabLayout.newTab() विधि का खुलासा करता है।

TabLayout से विस्तारित एक वर्ग बनाएं और निम्नानुसार newTab() ओवरराइट करें।

public class TabLayoutWithCustomTabView extends TabLayout { 
    public TabLayoutWithCustomTabView(Context context) { 
     super(context); 
    } 

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TabLayoutWithCustomTabView(Context context, AttributeSet attrs, 
             int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @NonNull 
    @Override 
    public Tab newTab() { 
     final Tab tab = super.newTab(); 
     tab.setCustomView(inflate(getContext(), R.layout.custom_layout, null)); 
     return tab; 
    } 
} 

अपने लेआउट में, नया वर्ग जहां TabLayout था का उपयोग करें।

<com.example.TabLayoutWithCustomTabView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     ... /> 
+0

पर अद्यतन किया यह एक शानदार जवाब है। यह जोड़ने के मुद्दे को हल करेगा> 1 टैब जहां अन्य विचार लोड नहीं होते हैं। – Silmarilos

+0

यह बढ़िया है लेकिन हम नए टैब के इंडेक्स को प्राप्त करने के लिए टैब शीर्षक कैसे सेट करते हैं। इसलिए हम शीर्षक सेट कर सकते हैं – suulisin

2

यह एक बग हो सकती है! और मैं अभी भी का सामना कर रहा हूं नवीनतम 25.2.0 समर्थन एसडीके पर इसका सामना कर रहा हूं। जब viewpager अद्यतन किया जाता है

डिफ़ॉल्ट रूप से, tablayoutस्वत: रीफ्रेश साथ सौंपा गया है।यह निश्चित (वर्कअराउंड)द्वारा बंद स्वत: रीफ्रेश की तरह नीचे कोड में बदल,

viewPager = (ViewPager) findViewById(R.id.viewpager); 
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 

setupViewPager(viewPager); 
tabLayout.setupWithViewPager(viewPager,false); // Do like this to disable auto refresh of tabs 
0

टैब की ऊंचाई 48dp को तय हो गई है हो सकता है। सामग्री दिशानिर्देश 48 डीपी का उपयोग करते हैं जब आपके पास केवल टेक्स्ट होता है लेकिन यदि आप आइकन चाहते हैं तो ऊंचाई 72 डीपी (टैब दिशानिर्देश) है। तो इसे हल करने मैं TabLayout subclassed और इस तरह से onMeasure overrided:

@Override शून्य onMeasure संरक्षित (पूर्णांक widthMeasureSpec, पूर्णांक heightMeasureSpec) { super.onMeasure (widthMeasureSpec, heightMeasureSpec); super.setMeasuredDimension (widthMeasureSpec, MeasureSpec.makeMeasureSpec (MeasureSpec.getSize (heightMeasureSpec), MeasureSpec.EXACTLY)); }

और आपको टैब की ऊंचाई xml में भी सेट करने की आवश्यकता है।

एंड्रॉयड: layout_height = "72dp"

तो यह है कि यह ठीक से काम करेगा।

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