1

Ich versuche, eine Schleife ViewPager zu implementieren. Ich habe es getan, indem ich zwei Dummy-Seiten an der ersten und letzten Stelle meiner Seiten hinzugefügt habe. Und ich verwende TabLayout damit als Seitenindikator, deshalb wollte ich den ersten und letzten Tab auf transparent und deaktiviert setzen. Dies ist mein aktueller XML-Code für TabLayout:Wie ändert man die Farbe für den ersten und letzten Tab in TabLayout mit 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" /> 

Und das ist die ziehbar xml für 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"/> 

ich versucht habe state_first und state_last zu verwenden, aber es funktioniert nicht.

Dies ist eine Tricking-Methode für mich, aber ich habe einige Tutorials zu Looping ViewPager zu implementieren gesucht. Die meisten von ihnen erfordern mindestens 4 Seiten, was in meinem Fall nicht geeignet ist, da die Seiten in ViewPager dynamisch sind, weniger als 4 Seiten haben können. Bitte helfen.

Das ist mein Adapter-Klasse:

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

können Sie den Java-Code für Ihre PagerAdapter-Klasse hinzufügen? und auch wo es benutzt wird (Aktivität, Fragment, etc.). Sie müssen es möglicherweise programmgesteuert tun – chornge

Antwort

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

Es scheint, dass Ihr Antwortformat falsch ist. Aber was ich versuche zu tun ist, die erste und letzte Registerkarte "transparent" machen, egal, ob es ausgewählt ist oder nicht. Kann ich dies mit tabSelectedListener erreichen? –

+0

Nun, ich habe es mit dieser Methode gemacht, Grundsätzlich habe ich das Symbol für die mittleren Registerkarten und transparentes Symbol für die erste und letzte Registerkarte in Selected und nicht ausgewählten Methode. Und wählen Sie alle Tabs einmal aus (es wird zur ersten Seite zurückgehen, da die letzte Seite die Dummy-Seite für die erste Seite ist). Danke für die Hilfe. –

+0

Gern geschehen. – shenweiwei

1

Sie wollen etwas entlang der Linien von:

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); 

die Hintergrundfarbe der ersten und letzten Tabs transparent sein werden und Klick-Ereignisse werden nicht ausgelöst, wenn auf diese beiden Registerkarten geklickt wird.

+0

Dies ist in meinem Fall nicht praktikabel, ich habe den Seitenanzeiger (tabLayout) mit tabBackground gesetzt. Ich bekomme null, wenn ich versuche, getIcon() für meine Registerkarte zu verwenden. Sollte ich es ändern? –

+0

oh rechts, es ist nicht sichtbar, weil 0 macht es so transparent es verschwindet, versuchen Sie mit einem Alpha von 90. – chornge

+0

Entschuldigung, ich falsch gelesen Ihren Kommentar, ich dachte, Sie sagten "sichtbar", ich habe einige Änderungen hinzugefügt, versuchen Sie es erneut und lassen Sie mich kennt. – chornge

Verwandte Themen