TabLayout+ViewPager实现的底部导航栏自定义控件
每次开发基本都要写底部导航栏,于是自己用自己喜欢的方式(TabLayout+ViewPager)封装了一个简单的控件,方便以后直接拿来用,当然实现导航栏方式很多,这里只介绍这一种.
github地址:github.com/jie35688/MyNavigationBar
首先为了能够动态设置ViewPager的滑动,先简单自定义了一个Viewpager,提供动态设置方法,当然也提供了自定义属性isScroll.
private boolean isScroll =true;
public MyViewPager (Context context) { super(context); }
public MyViewPager (Context context, AttributeSet attrs) {
super(context,attrs);
TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
if(arry != null) {
isScroll = array.getBoolean(R.styleable.MyViewPager_isScroll,true);
array.recycle();
}
}
public void setScrool(booleanb) { isScroll = b};
@Override
public boolean onTouchEvent(MotionEvent ev) {
if(isScroll) { return super.onTouchEvent(ev);}
return false;
}
onInterceptTouchEvent()方法也类似这样返回.
接着,回到正题,这个控件名叫NavigationBar,继承自Framelayout,提供了addFragment(),和addTab(),可在Activity等界面方便的添加不同的Fragment以及对应的导航tab,需要注意的是要先添加fragment,再添加tab,最后要记得调用一下initTab(),这样就完成了.
NavigationBar navigationBar = (NavigationBar) findViewById(R.id.navigation_bar);
//添加自己需要的fragment
navigationBar.addFragments(newFirstFragment());
navigationBar.addFragments(newSecondFragment());
//添加自己需要的tab,数量要对应于fragment的数量
navigationBar.addTab(LayoutInflater.from(this).inflate(R.layout.tab_main,null));
navigationBar.addTab(LayoutInflater.from(this).inflate(R.layout.tab_category,null));
navigationBar.initTab();//添加完后要initTab
NavigationBar的具体封装可以下载源码查看:github.com/jie35688/MyNavigationBar