2017-07-26 6 views
0

J'utilise un TabLayout combiné avec un ViewPager et j'ai mis une vue personnalisée pour mes onglets. Tout fonctionne comme prévu lorsque les onglets sont sélectionnés et non sélectionnés (la vue personnalisée est modifiée en fonction de l'onglet sélectionné/non sélectionné).
Le problème est au premier lancement, la méthode onTabSelected n'est jamais appelée.
Voici mon activité:Android - onTabSelected pas appelé à la première fois avec customView

setupViewPager(viewPager);  
tabLayout.setupWithViewPager(viewPager);  

for (int i = 0; i < tabLayout.getTabCount(); i++) { 
    tabLayout.getTabAt(i).setCustomView(getViewAt(i)); 
} 

tabLayout.addOnTabSelectedListener(this);  

Ce sont les setupViewPager et d'autres méthodes:

private void setupViewPager(ViewPager viewPager) { 
    MyFragmentPagerAdapter adapter = new MyFragmentPagerAdapter(getChildFragmentManager(), getContext(), startDate, endDate); 
    viewPager.setAdapter(adapter); 
}  

private View getViewAt(int i){ 
    final Date currentDate = CalendarUtility.addDay(startDate, i); 
    View v = LayoutInflater.from(getContext()).inflate(R.layout.layout_custom_tab, null); 
    TextView day = (TextView) v.findViewById(R.id.day); 
    TextView num = (TextView) v.findViewById(R.id.num); 
    day.setText(CalendarUtility.getDayOfWeek(currentDate)); 
    num.setText(CalendarUtility.getDayOfMonth(currentDate)); 
    return v; 
} 

@Override 
public void onTabSelected(TabLayout.Tab tab) { 
    Toast.makeText(getContext(), "Tab #"+tab.getPosition(), Toast.LENGTH_LONG).show(); 
    TextView num = (TextView)tab.getCustomView().findViewById(R.id.num); 
    num.getBackground().setColorFilter(textDarkColor, PorterDuff.Mode.SRC_IN); 
} 

@Override 
public void onTabUnselected(TabLayout.Tab tab) { 
    TextView num = (TextView)tab.getCustomView().findViewById(R.id.num); 
    num.getBackground().setColorFilter(pinkDarkColor, PorterDuff.Mode.SRC_IN); 
} 

Voici enfin le comportement lors de la navigation dans les onglets
https://i.stack.imgur.com/Scm9P.png

Les onglets premier lancement, aucun onglet n'est sélectionné
https://i.stack.imgur.com/a6Xgd.png

Quelqu'un peut-il vous aider s'il vous plaît?

Répondre

0

Dans votre classe d'adaptateur, effectuez deux méthodes.

public void setOnSelectedView(TabLayout tabLayout, int position) { 
    TabLayout.Tab tab = tabLayout.getTabAt(position); 
    if (tab != null) { 
     View selected = tab.getCustomView(); 
     TextView num = (TextView)selected.findViewById(R.id.num); 
num.getBackground().setColorFilter(textDarkColor, PorterDuff.Mode.SRC_IN); 
     tab.select(); 
    } 
} 

public void setunSelectedView(TabLayout tabLayout, int position) { 
    TabLayout.Tab tab = tabLayout.getTabAt(position); 
    if (tab != null) { 
     View selected = tab.getCustomView(); 
     TextView num = (TextView)selected.findViewById(R.id.num); 
num.getBackground().setColorFilter(pinkDarkColor, PorterDuff.Mode.SRC_IN); 
     tab.select(); 
    } 
} 

maintenant dans onTabSelected et onTabUnselected méthode appellent ces méthodes.

Et si vous voulez lancer le premier sélectionné onglet puis dans onCreate() méthode appel

setOnSelectedView(0,tabLayout); 

Note: Une autre façon est dans la méthode getViewAt() il suffit de vérifier positionner

if(i==0){ 
    num.getBackground().setColorFilter(textDarkColor, PorterDuff.Mode.SRC_IN); 
    }else{ 
    num.getBackground().setColorFilter(pinkDarkColor, PorterDuff.Mode.SRC_IN); 
    } 
+0

La première solution fonctionne comme un charme, et bien sûr le deuxième aussi @Piyush – Leonald

+0

@Leonald Great! – Piyush

0

OnTabSelected est uniquement appelée en cas de modification de la sélection d'onglet. Comme si vous étiez sur le deuxième onglet et sélectionné le premier onglet. Donc, au lieu de changer votre point de vue. Vous pouvez l'ajouter à la méthode FragmentStatePagerAdapter getItem, vous y obtiendrez la position actuellement sélectionnée.