2013-02-06 36 views
8

ऊपर प्रतीक मैं ViewPagerIndicator उपयोग कर रहा हूँ और मैं डिफ़ॉल्ट है, जो बाईं ओर आइकन स्थानों के बजाय, टैब शैली तो मैं पाठ के ऊपर आइकन मिल सकता है परिवर्तन करना चाहते हैं, और शीर्षक दांई ओर।ViewPagerIndicator टैब्स: पाठ

+0

हाय, इस मुद्दे के लिए कोई समाधान? – Kid24

उत्तर

8

आप ViewPageIndicator लाइब्रेरी के स्रोत कोड में केवल 1 पंक्ति को संशोधित करके इस प्रभाव को प्राप्त कर सकते हैं।

लाइन संशोधित करने की addTab विधि के अंदर TabPageIndicator वर्ग में नंबर 180 में है (कम से कम कोड 28/05/2013 की आज की संस्करण पर)

मूल फ़ाइल

180  tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0); 
है

और यदि आप आइकन के टेक्स्ट पर शीर्ष पर जाना चाहते हैं तो आपको इसे निम्न में संशोधित करना चाहिए।

180  tabView.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0); 

यहाँ बदलाव का एक स्क्रीनशॉट

enter image description here

आप शायद अब तक अनुमान लगाया रूप में, आप आइकन कहीं भी पाठ के आसपास setCompoundDrawablesWithIntrinsicBounds के विभिन्न तर्कों के भीतर iconResId के साथ कार्य करके रख सकते हैं तरीका।

+0

रॉबर्ट, मैंने सिर्फ ए-सी के सभी बिंदुओं से सम्मानित किया। मैंने सोचा कि मैं कई उत्तरों पर बिंदु को विभाजित कर सकता हूं, लेकिन स्पष्ट रूप से जिस तरह से मैंने बक्षीस नहीं बनाया है। माफ़ कीजिये! आपका जवाब * सराहना की है, फिर भी! –

13

कारण है कि प्रतीक हमेशा बाईं पर दिखाई देते हैं क्योंकि कोड के इस टुकड़े की है:

if (iconResId != 0) { 
    tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0); 
} 

TabPageIndicator.java

यह एक निजी विधि (addTab()) का हिस्सा है, और इतने में पाया, लाइब्रेरी को संशोधित किए बिना बदला नहीं जा सकता है।

सौभाग्य से, यह करना मुश्किल नहीं है। सुनिश्चित करें कि आप ViewPagerIndicator स्रोत डाउनलोड किया कोड है, फिर TabPageIndicator.java

खोल आप स्थान स्थायी रूप से बदलने के लिए (स्थायी रूप के रूप में आप एक स्रोत कोड बदलने के साथ प्राप्त कर सकते हैं) चाहते हैं, setCompoundDrawablesWithIntrinsicBounds() विधि में iconResId का स्थान बदलने के । उदाहरण के लिए, विधि के लिए दूसरा तर्क होने के लिए शीर्ष पर आइकनों को iconResId रखना आवश्यक है।

tabView.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0); 

आप कुछ थोड़ा और अधिक लचीला की जरूरत है, मैं इन परिवर्तनों (अभी भी TabPageIndicator.java में) है कि काम करना चाहिए के साथ आया था। इन परिवर्तनों को on my GitHub प्रतिबिंबित किया गया है, इसलिए एक कार्य उदाहरण है।

सदस्य चर:

/** 
* Constants to improve readability - no magic numbers. 
*/ 
public final static int LOCATION_LEFT =0; 
public final static int LOCATION_UP = 1; 
public final static int LOCATION_RIGHT = 2; 
public final static int LOCATION_BOTTOM =3; 

/** 
* Stores the location of the tab icon 
*/ 
private int location = LOCATION_LEFT; 

/** 
* Used to store the icon. 
*/ 
private int [] drawables = new int [4]; 

/** 
* Holds the value used by setCompoundDrawablesWithIntrinsicBounds used to denote no icon. 
*/ 
private static int NO_ICON = 0; 

इस विधि जोड़ें:

public void setTabIconLocation (int newLocation){ 
    if (location > LOCATION_BOTTOM || location < LOCATION_LEFT) 
     throw new IllegalArgumentException ("Invalid location"); 
    this.location = newLocation; 
    for (int x = 0; x < drawables.length;x++){ 
     drawables [x] = NO_ICON; 
    } 
} 

addTab() में, बदल

if (iconResId != 0) { 
    tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0); 
} 

को

if (iconResId != 0) { 
    drawables [location] = iconResId; 
    tabView.setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]); 
} 

गैर पुस्तकालय कार्यान्वयन (बशर्ते नमूना कोड से लिया)

TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator); 
indicator.setTabIconLocation (TabPageIndicator.LOCATION_UP); 
indicator.setViewPager(pager); 
+0

आपके उत्तर और गीथूब पर काम करने की प्रतिलिपि के लिए धन्यवाद, बहुत सराहना की! मैं पुस्तकालय के माध्यम से संभव नहीं होने से डरता था। आह ठीक है, शायद मैं एक पुल अनुरोध महसूस करूंगा (जब तक आप इसे करने जा रहे हैं :))। फिर से धन्यवाद। –

+0

मुझे अभी एहसास हुआ कि मैं अभी तक बाउंटी अंक असाइन नहीं कर सकता (केवल 24 बजे के बाद ही ऐसा कर सकता हूं): जब मैं सक्षम हूं तो मैं उन्हें आपके और रॉबर्ट के बीच विभाजित कर दूंगा। –

+0

@ बार्टकिअर्स कोई समस्या नहीं :-) मैंने कोड में कुछ छोटे बदलाव किए हैं, और एक बार जब मैं सत्यापित करता हूं कि यह काम कर रहा है, ठीक है, तो मैं एक पुल अनुरोध भेजूंगा। –

0

ऐसा करने के लिए पुस्तकालय को संशोधित किए बिना एक क्लीनर तरीका नहीं है। बस अपनी परियोजना में TabPageIndicator कक्षा को कॉपी और पेस्ट करें और अन्य उत्तरों में बताई गई रेखाओं को संशोधित करें। फिर कक्षा को जो भी आप पसंद करते हैं उसका नाम बदलें और इसका उपयोग करें जैसे कि यह TabPageIndicator था।

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

  • कोई संबंधित समस्या नहीं^_^