2015-06-22 6 views
12

Używam nowej obsługi TabLayout od Androida. Chodzi o to, że chciałem użyć selektorów do zmiany ikony po wybraniu karty.Jak używać selektorów do zmiany ikon dzięki nowemu TabLayout

Szukałem kodu źródłowego i wydaje mi się, że to nigdy nie zmienia stanu widoku (i z tego powodu nie mogę użyć selektora).

Czy ktoś zna jakieś obejście tego problemu?

Dziękujemy!

+0

jak u ur rozwiązany problem, bo moje nie jest uzyskiwanie rozwiązany z CustomView – Erum

Odpowiedz

1

Istnieje sposób ustawienia customView jako zakładki za pomocą metody setCustomView(View view). Możesz więc utworzyć widok tekstowy i ustawić selektor oraz ustawić ten widok na zakładce.

Mam nadzieję, że to pomoże!

0

Jeśli zrobiłeś wszystko dobrze (i wierzę w to), więc dotarłeś w tym samym punkcie co ja. Może to mały błąd w nowej bibliotece Android appcompat.

Znalazłem obejście problemu (nazywa się Gambiarra w dobrym Portugues), aby rozwiązać ten problem. trzeba zadzwonić metoda select() z klasy Tab tak:

mTabLayout.getTabAt(x).select(); 

ale to bardzo ważne: x zmienna musi być inna niż bieżącego indeksu wybranej zakładki.

43

zakładamy my_selector.xml jest

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/icon_on" android:state_selected="true"/> 
    <item android:drawable="@drawable/icon_off"/> <!-- default --> 
</selector> 

następnie możesz zadzwonić setIcon bezpośrednio

tab.setIcon(R.drawable.my_selector); 

Zweryfikowane z 'com.android.support:design:22.2.0'.

+4

To powinno być zaakceptowane odpowiedź .. – FingerSmith

+0

Działa to świetnie, ale spotkałem się z dziwactwem. Pierwsza karta nie zostanie wybrana. Czy to tylko ja? Próbowałem ręcznie ustawić pager na 0 ('pager.setCurrentItem (0);') – iroyo

+0

Metoda setIcon nie może być rozwiązana – kgandroid

1

Znalazłem, że po pierwszym ustawieniu niestandardowego widoku dla każdej zakładki w TabLayout, muszę ustawić pierwszą (indeks 0), jak wybrano.

TabLayout toolbarTabLayout = (TabLayout) findViewById(R.id.tabs); 
    toolbarTabLayout.setupWithViewPager(mViewPager); 
    toolbarTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
    toolbarTabLayout.setTabMode(TabLayout.MODE_FIXED); 
    toolbarTabLayout.setTabTextColors(R.color.colorPrimary, R.color.white); 
    // Iterate over all tabs and set the custom view 
    for (int i = 0; i < toolbarTabLayout.getTabCount(); i++) { 
     TabLayout.Tab tab = toolbarTabLayout.getTabAt(i); 
     View v=mSectionsPagerAdapter.getTabView(i); 
     // no tabs are actually selected at start, this will make sure the 
     // selector for the colors comes in right when initialized 
     if (i==0) 
      v.setSelected(true); 
     tab.setCustomView(v); 
    } 

Wydaje się, że wymusza pierwszą kartę jako wybraną, gdy zastosowano niestandardowy widok. To naprawdę wygląda na włamanie, mam nadzieję, że ktoś inny odkryje prawdziwy problem i zaproponuje lepszą naprawę.

0

To co pracował dla mnie:

Zakładając, że twoi selektorów ustawić w folderze res rozciągliwej (jak Xingang Huang pokazał powyżej). W swojej główną działalność (gdzie można skonfigurować swoją TabLayout), które obejmują swoją tablicę ikony selektorów i wtedy pętla przez to tak:

for (int i = 0; i < yourTabLayout.getTabCount(); i++) { 
     ImageView imageView = new ImageView(this); //your context, in this case MainActivity.class 
     imageView.setImageResource(arr_tabIcons[i]); //tabIcons is the array of icons 
     if (i==0) { 
      imageView.setSelected(true); 
     } 
     yourTabLayout.getTabAt(i).setCustomView(imageView); 

    } 

tab.setIcon (R.drawable.icon)

działa również, ale w moim przypadku ikony wyglądały na naprawdę małe, więc musiałem użyć rozwiązania z ImageView, aby wypełnić widok kart.

Szczęśliwy kodowania;)

Powiązane problemy