2017-09-15 10 views
1

J'essaie d'implémenter une boucle ViewPager. Je l'ai fait en ajoutant deux pages factices à la première et dernière place de mes pages. Et j'utilise TabLayout avec comme un indicateur de page, c'est pourquoi je voulais mettre le premier et le dernier onglet à transparent et désactivé. Ceci est mon code actuel xml pour TabLayout:Comment changer la couleur du premier et du dernier onglet dans la configuration de TabLayout avec ViewPager?

<android.support.design.widget.TabLayout 
    android:id="@+id/tabDots" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_gravity="bottom" 
    app:tabBackground="@drawable/tab_selector" 
    app:tabGravity="center" 
    app:tabIndicatorHeight="0dp" /> 

Et c'est le xml drawable pour TabLayout:

<item android:drawable="@drawable/tab_indicator_default" 
    android:state_selected="false" 
    android:state_focused="false" 
    android:state_pressed="false"/> 

<item android:drawable="@drawable/tab_indicator_selected" 
    android:state_first="false" 
    android:state_last="false" 
    android:state_selected="true"/> 

J'ai essayé d'utiliser state_first et state_last mais il ne fonctionne pas.

Ceci est une méthode de tromperie pour moi mais j'ai cherché quelques tutoriels pour implémenter Looping ViewPager. La plupart d'entre eux nécessitent au moins 4 pages ce qui ne convient pas dans mon cas car les pages en ViewPager sont dynamiques, pourraient avoir moins de 4 pages. S'il vous plaît aider.

C'est ma classe d'adaptation:

public class ShopPageAdapter extends PagerAdapter { 
    // This holds all the currently displayable views, in order from left to right. 
    private ArrayList<View> views = new ArrayList<View>(); 

    @Override 
    public int getItemPosition(Object object) { 
     int index = views.indexOf(object); 
     if (index == -1) 
      return POSITION_NONE; 
     else 
      return index; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     View v = views.get(position); 
     if(v.getParent() != null) 
      ((ViewGroup) v.getParent()).removeView(v); 
     container.addView(v); 
     return v; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView(views.get(position)); 
    } 

    @Override 
    public int getCount() { 
     return views.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view == object; 
    } 

    public int addView(View v) { 
     return addView(v, views.size()); 
    } 

    public int addView(View v, int position) { 
     views.add(position, v); 
     return position; 
    } 

    public int removeView(ViewPager pager, View v) { 
     return removeView(pager, views.indexOf(v)); 
    } 

    public int removeView(ViewPager pager, int position) { 
     pager.setAdapter(null); 
     views.remove(position); 
     pager.setAdapter(this); 

     return position; 
    } 

    public View getView(int position) { 
     return views.get(position); 
    } 
} 
+0

pouvez-vous ajouter le code java pour votre classe pagerAdapter? et aussi où il est utilisé (activité, fragment, etc). vous devrez peut-être le faire par programme – chornge

Répondre

3
tableLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
    @Override 
    public void onTabSelected(TabLayout.Tab tab) { 
     switch (tab.getPosition()) 
     { 

     } 
    } 

    @Override 
    public void onTabUnselected(TabLayout.Tab tab) { 

    } 

    @Override 
    public void onTabReselected(TabLayout.Tab tab) { 

    } 
}); 
+0

Il semble que votre format de réponse est faux. Mais ce que j'essaie de faire est de rendre le premier et dernier onglet "transparent", peu importe s'il est sélectionné ou non. Puis-je y parvenir en utilisant tabSelectedListener? –

+0

Eh bien, je l'ai fait en utilisant cette méthode, Fondamentalement, je définis l'icône pour les onglets du milieu et l'icône transparente pour les onglets premier et dernier dans la méthode sélectionnée et non sélectionnée. Et sélectionnez tous les onglets une fois (il reviendra à la première page parce que la dernière page est la page factice pour la première page). Merci pour l'aide. –

+0

De rien. – shenweiwei

1

Vous voulez quelque chose le long des lignes de:

PagerAdapter pagerAdapter = new ShopPageAdapter(getActivity().getSupportFragmentManager()); 
viewPager.setAdapter(pagerAdapter); 
tabLayout.setupWithViewPager(viewPager);   

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
LinearLayout firstAndLastTabs = ((LinearLayout) tabLayout.getChildAt(0)); 
firstAndLastTabs.setEnabled(false); 
firstAndLastTabs.getChildAt(0).setBackgroundColor(getResources() 
      .getColor(android.R.color.transparent)); 
firstAndLastTabs.getChildAt(0).setClickable(false); 

firstAndLastTabs.getChildAt(tabLayout.getTabCount() - 1).setBackgroundColor(getResources().getColor(android.R.color.transparent); 
    firstAndLastTabs.getChildAt(tabLayout.getTabCount() - 1).setClickable(false); 

la couleur de fond des premiers et derniers onglets vont être transparents et les événements de clic ne seront pas déclenchés lorsque ces deux onglets sont cliqués.

+0

Ce n'est pas viable dans mon cas, je définis l'indicateur de page (tabLayout) en utilisant tabBackground. Je reçois null quand j'essaie d'utiliser getIcon() pour mon onglet. Devrais-je le changer? –

+0

oh à droite, ce n'est pas visible car 0 le rend si transparent il disparaît, essayez avec un alpha de 90. – chornge

+0

désolé, j'ai mal lu votre commentaire, je pensais que vous avez dit "visible", j'ai ajouté quelques modifications, essayez à nouveau et laissez-moi connaître. – chornge