2015-12-21 15 views
10

Sto usando un TabLayout per la navigazione a schede nella mia app. Ho un problema davvero strano con esso, ho creato 4 schede utilizzando questo codice:TabLayout L'icona della scheda selezionata non è selezionata all'avvio:

private int[] tabIcons = {R.drawable.navigation_timeline_icon_selector, R.drawable.navigation_feed_icon_selector, 
     R.drawable.navigation_messages_icon_selector, R.drawable.navigation_notification_icon_selector}; 

TabLayout tabLayout = setTabLayout(); 
    if (tabLayout != null) { 
     for (int i = 0; i < 4; i++) { 
      tabLayout.getTabAt(i).setIcon(tabIcons[i]); 
     } 
    } 

ciascuno degli elementi in tabIcon è un selector con stati selezionati e non selezionati. Tutti i selettori icone sono configurati come segue:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:drawable="@drawable/navigation_timeline_selected_icon" android:state_selected="true"/> 
     <item android:drawable="@drawable/navigation_timeline_selected_icon" android:state_pressed="true"/> 
     <item android:drawable="@drawable/navigation_timeline_icon" /> 
</selector> 

Il problema è che quando l'applicazione inizia la prima scheda selezionata (indice 0) non utilizza l'icona stato selezionato. Invece usa lo stato non selezionato.

per essere più esplicativo Ecco uno screenshot del problema, al primo avvio la mia scheda è simile al seguente:

enter image description here

quando invece dovrebbe essere simile a questo:

enter image description here

Dopo aver cambiato una pagina tutte le icone tornano alla piena funzionalità e gli stati selezionati sono selezionati correttamente.

Ho provato a utilizzare il metodo ma il risultato è lo stesso dell'icona utilizzata è l'icona non selezionata.

Qualcuno sa cosa posso fare per risolverlo?

Grazie in anticipo.

+0

Non è sicuro se hai provato quello che ho suggerito . come hai detto hai provato select(). –

+0

Potrebbe esserci un problema con personalizzazioni disegnabili –

+0

@MsYvette che cosa significa e come può essere gestito? –

risposta

2

La risposta corretta per la selezione della scheda al TabLayout sarebbe:

TabLayout.Tab currentTab = mTabs.getTabAt(selectedTab); 
if (currentTab != null) { 
    View customView = currentTab.getCustomView(); 
    if (customView != null) { 
     customView.setSelected(true); 
    } 
    currentTab.select(); 
} 

dove currentTab.select() sarà spostare l'indicatore per la scheda selezionata, quando customView.setSelected() farà tutti gli elementi nella visualizzazione personalizzata impostare i loro stati selezionati dalla i selezionatori sembrano selezionati.

0

Prova a selezionare la scheda dopo averli popolati.

TabLayout tabLayout = setTabLayout(); 
if (tabLayout != null) { 
    for (int i = 0; i < 4; i++) { 
     tabLayout.getTabAt(i).setIcon(tabIcons[i]); 
    } 
    tabLayout.getTabAt(0).select(); 
} 
+0

come ho detto: ho provato a utilizzare il metodo TabLayout.Tab select() ma il risultato è lo stesso dell'icona utilizzata è l'icona non selezionata. –

+0

Oh scusa, non ero sicuro, ho lasciato un commento sotto la tua domanda. Avrò un pensiero –

+0

@EmilAdz quindi quale ** è ** l'elemento selezionato? È sempre lo stesso? –

10

Prova questo:

tabLayout.getTabAt(yourInitialPosition).getCustomView().setSelected(true);

+0

Non ho un metodo "getCustomView()", perché non ho aggiunto le mie schede come visualizzazione personalizzata ma come semplici icone semplici. Quindi, anche se funziona, non posso usare questa soluzione. –

+0

getCustomView è un metodo pubblico dalla classe TabLayout.Tab, quindi è necessario averlo e in questo caso restituirà il selettore drawable che si sta applicando a questa scheda. Non capisco perché non puoi usarlo se funziona. Forse mi manca qualcosa .. Puoi elaborare per favore? – emirua

+0

E se non è possibile utilizzare questa soluzione, è sempre possibile modificare la selezione in una scheda diversa e quindi tornare alla posizione iniziale in modo programmatico. – emirua

3

ho usato nel mio tabLayout selettore XML per le icone con i seguenti stati:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/icon_ajuda_off"/> 
<item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/icon_ajuda_on"/> 
<item android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/icon_ajuda_on"/> 
<item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/icon_ajuda_on"/> 

e nel codice :

private int[] tabIcons = {R.drawable.ic_tab_sites, R.drawable.ic_tab_help, 
     R.drawable.ic_tab_profile, R.drawable.ic_tab_notification, R.drawable.ic_tab_search}; 

if (tabLayout != null) { 
    for (int i = 0; i < 5; i++) { 
     tabLayout.getTabAt(i).setIcon(tabIcons[i]); 
    } 
} 

Potrebbe essere d'aiuto.

0

qui è la soluzione, incolla questo codice in voi onCreate attività perché l'utilizzo di schede 0 indice non fa scattare direttamente questo è il modo semplice per farlo

viewPager.setCurrentItem(1); 
    if (viewPager.getCurrentItem()==1) 
    { 
     viewPager.setCurrentItem(0); 
    } 
Problemi correlati