2017-09-15 52 views
1

我正在尝试执行循环ViewPager。我在页面的第一个和最后一个位置添加了两个虚拟页面。我使用TabLayout作为页面指示器,这就是为什么我想将第一个和最后一个选项卡设置为透明和禁用。 这是我TabLayout当前XML代码:如何使用ViewPager更改TabLayout中第一个和最后一个选项卡的颜色?

<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" /> 

这是TabLayout提拉XML:

<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"/> 

我试图state_first和state_last使用,但它不能正常工作。

这是一个欺骗手段,但我已经搜索了一些教程来实现循环ViewPager。他们大多数需要至少4页,这是不适合我的情况,因为ViewPager页面是动态的,可能少于4页。 请帮忙。

这是我的适配器类:

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

你可以为你的pagerAdapter类添加java代码吗?以及它被使用的地方(活动,片段等)。你可能需要编程 – chornge

回答

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

这似乎是你的答案格式是错误的。 但我想要做的是使第一个和最后一个选项卡“透明”,无论它被选中或不。我可以使用tabSelectedListener实现这个吗? –

+0

嗯,我使用这种方法, 基本上我设置中间选项卡的图标和透明图标的第一个和最后一个选项卡在Selected和Unselected方法。并选择所有标签一次(它会回到第一页,因为最后一页是第一页的空白页)。谢谢您的帮助。 –

+0

不客气。 – shenweiwei

1

你想沿着线的东西:

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

第一个和最后一个选项卡的背景颜色将是透明的,点击这两个选项卡时,不会触发点击事件。

+0

这在我的情况下不可行,我使用tabBackground设置页面指示器(tabLayout)。当我试图为我的选项卡使用getIcon()时,我得到null。我应该改变它吗? –

+0

哦对,它是不可见的,因为0使它变得如此透明,它消失了,尝试用90的alpha。 – chornge

+0

对不起,我误解了你的评论,我以为你说“可见”,我已经添加了一些修改,再试一次,让我知道。 – chornge

相关问题