说明:因为我习惯实用DataBinding,所以本文使用了DataBinding 的知识,如果对 DataBinding 还没有一点了解的强烈建议大家一定先去了解一下 DataBinding 相关的知识Android DataBinding 详解)。
下面我们开始一步步来实现:
1.首先我们先来创建所需要的 Fragement 以及相对应的布局文件,这里我们拿首页 HomeFragment 来做示例:
首先创建 fragment_home.xml 布局文件如下:
这里非常简单,一个线性布局里面放一个 TextView,想必大家一看就明白,只是要注意最外层布局是
接下来创建 HomeFragment 类:
package com.example.qiudengjiao.tablayout.Module.home;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.qiudengjiao.tablayout.Base.BaseFragment;
import com.example.qiudengjiao.tablayout.R;
import com.example.qiudengjiao.tablayout.databinding.FragmentHomeBinding;
/**
* 主界面 - 首页Fragment
* Created by qiudengjiao on 2017/5/6.
*/
public class HomeFragment extends BaseFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
FragmentHomeBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false);
return binding.getRoot();
}
}
这样我们所需要的所有 Fragment 就全部创建完成,需要多少个 Tab 就创建多少个相对应的 Fragment,这个大家根据自己的项目来定
接下来我们来创建主布局文件 activity_main.xml 代码如下:
这里需要注意的是需要先在 app/build.gradle 中添加如下依赖,如果你的项目中还没有添加的话:
compile 'com.android.support:design:25.1.0'
/**
* 适配器
* Created by qiudengjiao on 2017/5/6.
*/
public class MainTabAdapter extends FragmentPagerAdapter {
private MainActivity mContext;
private HomeFragment homeFragment;
private HotFragment hotFragment;
private CategoryFragment categoryFragment;
private CartFragment cartFragment;
private MineFragment mineFragment;
public MainTabAdapter(MainActivity mainActivity) {
super(mainActivity.getSupportFragmentManager());
this.mContext = mainActivity;
//初始化Fragment
homeFragment = new HomeFragment();
hotFragment = new HotFragment();
categoryFragment = new CategoryFragment();
cartFragment = new CartFragment();
mineFragment = new MineFragment();
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return homeFragment;
} else if (position == 1) {
return hotFragment;
} else if (position == 2) {
return categoryFragment;
} else if (position == 3) {
return cartFragment;
} else if (position == 4) {
return mineFragment;
}
return null;
}
@Override
public int getCount() {
return 5;
}
}
这里我们继承 FragmentPagerAdapter,并且在构造函数里初始化了我们刚才准备好的 Fragment,还实现了它的 getItem() 和 getCount() 方法,在 getItem() 方法中返回相应的 Fragment,getCount() 方法中返回相对应的个数
接下来我们开始来定义 MainAcitivity,代码如下:
package com.example.qiudengjiao.tablayout;
import android.databinding.DataBindingUtil;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.example.qiudengjiao.tablayout.Adapter.MainTabAdapter;
import com.example.qiudengjiao.tablayout.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private FragmentPagerAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
//初始化适配器
mAdapter = new MainTabAdapter(this);
binding.viewPager.setAdapter(mAdapter);
//将TabLayout和ViewPager关联起来
binding.tabLayout.setupWithViewPager(binding.viewPager);
binding.viewPager.setOffscreenPageLimit(5);
initTab();
}
/**
* 设置添加Tab
*/
private void initTab() {
binding.tabLayout.getTabAt(0).setCustomView(R.layout.tab_home);
binding.tabLayout.getTabAt(1).setCustomView(R.layout.tab_hot);
binding.tabLayout.getTabAt(2).setCustomView(R.layout.tab_category);
binding.tabLayout.getTabAt(3).setCustomView(R.layout.tab_cart);
binding.tabLayout.getTabAt(4).setCustomView(R.layout.tab_mine);
//默认选中的Tab
binding.tabLayout.getTabAt(0).getCustomView().setSelected(true);
}
}
图片选择器:selector_tab_home.xml
到这里我们的底部导航栏就完成了,实现效果就是我们文章刚开始贴出的效果,到这里还有一个问题,那就是我们的底部导航栏是可以滑动的,但往往在实际项目中是不能滑动的,这个也好解决,就是我们需要去自定义一个 ViewPager,把滑动功能禁止掉就可以了,下面贴上自定义的 ViewPager,代码如下:
/**
* 不可滑动的ViewPager
* Created by qiudengjiao on 2017/1/20.
*/
public class NoScrollViewPager extends ViewPager {
public boolean canScroll = false;
public NoScrollViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return canScroll && super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return canScroll && super.onInterceptTouchEvent(ev);
}
@Override
public void setCurrentItem(int item) {
setCurrentItem(item, false);
}
}
接下来就是在 activity_main.xml 布局文件中去引用我们自己定义的 ViewPager,代码如下: