android学习-----使用TabLayout实现Tab选项卡以及遇到的一些问题(二)

时间:2021-07-01 06:26:21

TabLayout+ViewPager+Fragment的使用


1. Xml中添加一个ViewPager

<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="50dp"
app:tabBackground="@android:color/white"
app:tabIndicatorColor="@color/colorAccent"
app:tabIndicatorHeight="1dp"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorPrimaryDark"
app:tabTextColor="@android:color/black"
>
</android.support.design.widget.TabLayout>

</android.support.v4.view.ViewPager>


这里可以用ViewPager包裹住TabLayout。没有影响。


2.添加ViewPager里面的Fragment

public class MainActivity extends AppCompatActivity {

@InjectView(R.id.tabLayout)
TabLayout mTabLayout;
@InjectView(R.id.viewPager)
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);

mTabLayout.addTab(mTabLayout.newTab().setText("tab01"));
mTabLayout.addTab(mTabLayout.newTab().setText("tab02"));
mTabLayout.addTab(mTabLayout.newTab().setText("tab03"));
mTabLayout.addTab(mTabLayout.newTab().setText("tab04"));

List<String> list = new ArrayList<>();
list.add("tab Content 1");
list.add("tab Content 2");
list.add("tab Content 3");
list.add("tab Content 4");

SimpleFragmentAdapter simpleFragmentAdapter = new SimpleFragmentAdapter(getSupportFragmentManager(), list);
mViewPager.setAdapter(simpleFragmentAdapter);
mTabLayout.setupWithViewPager(mViewPager);


mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) { //点击第一次的tab选项回调
}

@Override
public void onTabUnselected(TabLayout.Tab tab) { //上一次的tab回调
Log.i("MainActivity", "onTabUnselected: " + tab.getText());
}

@Override
public void onTabReselected(TabLayout.Tab tab) { // 再次点击同一个tab的回调
Log.i("MainActivity", "onTabReselected: " + tab.getText());

}
});
}
}


还是昨天的代码 可以看见
List<String> list = new ArrayList<>();
list.add("tab Content 1");
list.add("tab Content 2");
list.add("tab Content 3");
list.add("tab Content 4");

SimpleFragmentAdapter simpleFragmentAdapter = new SimpleFragmentAdapter(getSupportFragmentManager(), list);
mViewPager.setAdapter(simpleFragmentAdapter);
mTabLayout.setupWithViewPager(mViewPager);

我们在这里添加的一个ViewPager的Adapter ,很简单的一个Fragment和Adapter这里就不贴代码了,看效果吧。



android学习-----使用TabLayout实现Tab选项卡以及遇到的一些问题(二)


这里可以看见TabLayout+ViewPager+Fragment基本上以及实现了。通过TabLayout的setupWithViewPager方法,讲TabLayout和ViewPager的切换事件关联起来。从源码可以看到这里setupWithViewPager 有2个重载方法,没试过autoRefresh=false时候的变化是什么。。。
  /**
* The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
*
* <p>This is the same as calling {@link #setupWithViewPager(ViewPager, boolean)} with
* auto-refresh enabled.</p>
*
* @param viewPager the ViewPager to link to, or {@code null} to clear any previous link
*/
public void setupWithViewPager(@Nullable ViewPager viewPager) {
setupWithViewPager(viewPager, true);
}

/**
* The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
*
* <p>This method will link the given ViewPager and this TabLayout together so that
* changes in one are automatically reflected in the other. This includes scroll state changes
* and clicks. The tabs displayed in this layout will be populated
* from the ViewPager adapter's page titles.</p>
*
* <p>If {@code autoRefresh} is {@code true}, any changes in the {@link PagerAdapter} will
* trigger this layout to re-populate itself from the adapter's titles.</p>
*
* <p>If the given ViewPager is non-null, it needs to already have a
* {@link PagerAdapter} set.</p>
*
* @param viewPager the ViewPager to link to, or {@code null} to clear any previous link
* @param autoRefresh whether this layout should refresh its contents if the given ViewPager's
* content changes
*/
public void setupWithViewPager(@Nullable final ViewPager viewPager, boolean autoRefresh) {
setupWithViewPager(viewPager, autoRefresh, false);
}

但是我们这里发现一个问题我们设置的TabItem去哪儿了? 看上去是有TabItem的但是怎么文字内容没显示呢?不着急慢慢来  是不是应该吧addTab的代码加到下面呢? 试试吧

这样写
 List<String> list = new ArrayList<>();
list.add("tab Content 1");
list.add("tab Content 2");
list.add("tab Content 3");
list.add("tab Content 4");

SimpleFragmentAdapter simpleFragmentAdapter = new SimpleFragmentAdapter(getSupportFragmentManager(), list);
mViewPager.setAdapter(simpleFragmentAdapter);
mTabLayout.setupWithViewPager(mViewPager);

mTabLayout.addTab(mTabLayout.newTab().setText("tab01"));
mTabLayout.addTab(mTabLayout.newTab().setText("tab02"));
mTabLayout.addTab(mTabLayout.newTab().setText("tab03"));
mTabLayout.addTab(mTabLayout.newTab().setText("tab04"));

先设置Adapter,然后添加tab这样看看效果吧



android学习-----使用TabLayout实现Tab选项卡以及遇到的一些问题(二)

问题一:TabLayout TabItem 显示不正常,空白问题


额,这是什么鬼,Tabitem看着是出现了,可是好像和想象中的不对,前面空白的地方是什么鬼?后面点击那几个又怎么没反应?
这个时候就需要百度下了吧。。。。。
好吧,结果发现呢,这是为啥呢,好像上面的空白部分的Item就是通过添加ViewPager里面Fragment数量产生的。然后我们有添加了几个item所以后面的item点击没反应?是个道理吗?
既然这样那么我们这样做
 List<String> list = new ArrayList<>();
list.add("tab Content 1");
list.add("tab Content 2");
list.add("tab Content 3");
list.add("tab Content 4");

SimpleFragmentAdapter simpleFragmentAdapter = new SimpleFragmentAdapter(getSupportFragmentManager(), list);
mViewPager.setAdapter(simpleFragmentAdapter);
mTabLayout.setupWithViewPager(mViewPager);

// mTabLayout.addTab(mTabLayout.newTab().setText("tab01"));
// mTabLayout.addTab(mTabLayout.newTab().setText("tab02"));
// mTabLayout.addTab(mTabLayout.newTab().setText("tab03"));
// mTabLayout.addTab(mTabLayout.newTab().setText("tab04"));

for (int i = 0; i < list.size(); i++) {
mTabLayout.getTabAt(i).setText("Tab" + i);
}


再看看效果呢?


android学习-----使用TabLayout实现Tab选项卡以及遇到的一些问题(二)


诶,好像是这个道理也,这样写法mTabLayout.getTabAt(i).setText(""); 可以去设置item的文字.

问题二: TabLayout tab文字大写问题


我明明是小写的Tab+i 为什么Item上面却是大写的TAB+i 为他的文字信息,这还真是奇怪。本想通过样式的方式解决掉,发现不行,后来我网上找了一下,发现这是一个bug,https://code.google.com/p/android/issues/detail?id=202117,不过现在已经修复了,添加样式
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item>
</style>

在TabLayout xml标签下,这样写

<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
app:tabTextAppearance="@style/MyCustomTextAppearance"
android:layout_width="match_parent"
android:layout_height="50dp"
app:tabBackground="@android:color/white"
app:tabIndicatorColor="@color/colorAccent"
app:tabIndicatorHeight="1dp"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorPrimaryDark"
app:tabTextColor="@android:color/black"
>


注意标红部分,现在再看看效果
代码里面是这样设置的tab名
for (int i = 0; i < list.size(); i++) {
mTabLayout.getTabAt(i).setText("Tab" + i);
}
android学习-----使用TabLayout实现Tab选项卡以及遇到的一些问题(二)

现在Tab名称已经正确显示了,真是棒棒哒。

先就到这里,比如设置ico图标,自定义View 等等、、、、更多功能等待发掘。