如何更改使用 ViewPager 设置的 TabLayout 中第一个和最后一个选项卡的颜色?
How to change the color for the first and last tab in TabLayout setting up with ViewPager?
我正在尝试实现循环 ViewPager
。我通过在页面的第一个和最后一个位置添加两个虚拟页面来做到这一点。我将 TabLayout
用作页面指示器,这就是为什么我想将第一个和最后一个选项卡设置为透明和禁用的原因。
这是我当前的 xml 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 页。
请帮忙。
这是我的适配器class:
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);
}
}
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) {
}
});
您想要类似以下内容的内容:
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);
第一个和最后一个选项卡的背景颜色将变为透明,单击这两个选项卡时不会触发单击事件。
我正在尝试实现循环 ViewPager
。我通过在页面的第一个和最后一个位置添加两个虚拟页面来做到这一点。我将 TabLayout
用作页面指示器,这就是为什么我想将第一个和最后一个选项卡设置为透明和禁用的原因。
这是我当前的 xml 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 页。
请帮忙。
这是我的适配器class:
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);
}
}
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) {
}
});
您想要类似以下内容的内容:
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);
第一个和最后一个选项卡的背景颜色将变为透明,单击这两个选项卡时不会触发单击事件。