Używam ViewPagerIndicator i chciałbym zmienić styl zakładki, aby uzyskać ikony powyżej tekstu, zamiast domyślnego, co umieszcza ikonę po lewej stronie, a tytuł w prawo.ViewPagerIndicator Tabs: Ikony powyżej tekstu
Odpowiedz
Efekt ten można uzyskać, modyfikując tylko 1 wiersz kodu źródłowego biblioteki ViewPageIndicator.
Linia być modyfikowana jest w liczbie 180
w klasie wewnątrz metody addTab
TabPageIndicator
(przynajmniej na dzisiejszej wersji kodu 28/05/2013)
Oryginalny plik jest
180 tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
Powinieneś zmodyfikować go do następujących, jeśli chcesz, aby ikona była umieszczona na górze tekstu.
180 tabView.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0);
Oto zrzut ekranu ze zmianą
Jak zapewne domyślacie już, można umieścić ikonę wszędzie wokół tekstu grając z iconResId w ramach różnych argumentów setCompoundDrawablesWithIntrinsicBounds
metoda.
Robert, właśnie przyznałem wszystkie punkty A-C. Pomyślałem, że mogę podzielić ten punkt na wiele odpowiedzi, ale najwyraźniej nie w taki sposób, w jaki stworzyłem nagrodę. Przepraszam! Twoja odpowiedź * jest * doceniana, niemniej! –
Powodem ikony zawsze pojawiają się po lewej stronie jest z powodu tego kawałka kodu:
if (iconResId != 0) {
tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
}
znaleźć w TabPageIndicator.java
Jest to część prywatnej metody (addTab()
), a więc, nie można zmienić bez modyfikacji samej biblioteki.
Na szczęście nie jest to trudne. Upewnij się, że masz kod ViewPagerIndicator
źródłowy pobrany, a następnie otworzyć TabPageIndicator.java
Jeśli chcesz zmienić lokalizację na stałe (jako stały, jak można dostać się ze zmianą kodu źródłowego), należy zmienić lokalizację iconResId
w metodzie setCompoundDrawablesWithIntrinsicBounds() . Na przykład umieszczenie ikon u góry wymaga, aby drugi argument metody był iconResId
.
tabView.setCompoundDrawablesWithIntrinsicBounds(0, iconResId, 0, 0);
Jeśli potrzebujesz czegoś bardziej elastyczne, wymyśliłem tych zmian (nadal w TabPageIndicator.java
), które powinno działać. Zmiany te zostały odzwierciedlone w on my GitHub, więc istnieje działający przykład.
zmienne użytkownika:
/**
* 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;
Dodaj tę metodę:
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;
}
}
W addTab()
, zmień
if (iconResId != 0) {
tabView.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
}
do
if (iconResId != 0) {
drawables [location] = iconResId;
tabView.setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3]);
}
realizacja dla biblioteki (wzięte z przykładowego kodu przewidzianego)
TabPageIndicator indicator = (TabPageIndicator)findViewById(R.id.indicator);
indicator.setTabIconLocation (TabPageIndicator.LOCATION_UP);
indicator.setViewPager(pager);
Dzięki za odpowiedź i kopię roboczą na Github, bardzo doceniane! Obawiałem się, że nie jest to możliwe przez samą bibliotekę. No cóż, być może wyczuwam żądanie ściągnięcia (chyba że masz zamiar to zrobić :)). Jeszcze raz dzięki. –
Właśnie zdałem sobie sprawę, że nie mogę przypisać punktów bounty (mogę to zrobić dopiero po 24 godzinach): podzielę ich między ciebie i Roberta, kiedy będę mógł. –
@BartKiers Nie ma problemu :-) Wprowadziłem kilka drobnych zmian w kodzie, a gdy upewnię się, że działa poprawnie, wyślę żądanie ściągnięcia. –
Jest przejrzysty sposób to zrobić bez modyfikowania biblioteki. Po prostu skopiuj i wklej klasę TabPageIndicator do swojego projektu i zmodyfikuj linie wskazane w innych odpowiedziach. Następnie zmień nazwę klasy na cokolwiek chcesz i użyj jej tak, jakby była to TabPageIndicator
.
Witam, Jakieś rozwiązanie tego problemu? – Kid24