tablayout的使用
- TabLayout是在design下的包中,一般跟viewpager,fragment结合使用;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.geek.viewpagerfragmentdemo.MainActivity">
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/tabLayout"
/>
<android.support.design.widget.TabLayout
android:background="@drawable/tablayout_bg"
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignParentBottom="true"
app:tabIndicatorHeight="0dp"
/>
</RelativeLayout>
这里默认设置indicator的高度为0来不显示
- 但是在viewpager中用fragment存在着预加载机制,这个在一定的程度上很是麻烦,所以就使用懒加载机制来控制预加载模式,这里重写一个父类的BaseFragment来控制:
/**
* fragment 基类
*/
public abstract class BaseFragment extends Fragment{
protected boolean isInit = false;//视图是否已经初初始化
protected boolean isLoad = false;//是否加载
protected final String TAG = "BaseFragment";
private View view;//视图
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(setContentView(), container, false);
isInit = true;
initData();
/**初始化的时候去加载数据**/
isCanLoadData();
return view;
}
/**
* 视图是否可见
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanLoadData();
}
/**
* 是否可以加载数据
*/
private void isCanLoadData() {
if (!isInit) {
return;
}
if (getUserVisibleHint()) {
startLoad();
isLoad = true;
} else {
if (isLoad) {
stopLoad();
}
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
isInit = false;
isLoad = false;
}
protected View getContentView() {
return view;
}
/**
* findViewById
*/
protected <T extends View> T findViewById(int id) {
return (T) getContentView().findViewById(id);
}
protected abstract int setContentView();//显示的布局
protected abstract void startLoad();//加载数据
protected abstract void initData();//初始化数据
/**
* 当视图不可见并且加载过数据,调用此方法
*/
protected void stopLoad() {}
}
继承这个父类,在startLoad方法中加载相对应的方法。
- 在activity中来调用,具体如下:
private void initTabLayout(){
mFragment.clear();
mTabLayout.removeAllTabs();
mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
mFragment.add(new Fragment1());
mFragment.add(new Fragment2());
mFragment.add(new Fragment3());
mAdapter = new MyFragmentAdapter(getSupportFragmentManager(),mFragment,mContext);
mVp.setAdapter(mAdapter);
mVp.setOffscreenPageLimit(2);
//绑定ViewPager
mTabLayout.setupWithViewPager(mVp);
mVp.setCurrentItem(0);
for (int i=0;i<mTabLayout.getTabCount();i++){
TabLayout.Tab tab = mTabLayout.getTabAt(i);
if (tab!=null){
View v = mAdapter.getView(i);
if (i==0){//默认第一个选中
v.setSelected(true);
}
tab.setCustomView(v);
}
}
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
mVp.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
重写一个适配器。来加载数据;
总的来说是可以解决预加载机制问题,
效果图如下: