ViewPager+Fragment+FlycoTabLayout,20行代码实现tabbar(菜单切换效果)
2016-06-23 21:26
489 查看
前言
编码
补充
正如标题所说,只需要不到20行的代码,实现tabbar,菜单选择效果,先上图。
布局,很简单
具体控件的使用请查看源项目FlycoTabLayout,有详细的介绍,在此不多说。
创建一个fragment
此处应该不存在任何疑惑,绑定布局,获取一个textview而已。
主界面,MainActivity代码实现
这里就说一下MyPagerAdapter,用于viewpager绑定fragment使用,在activity中FragmentManager通过getSupportFragmentManager()去获取,如果在是在fragment中就需要通过getChildFragmentManager()去说去。
我想又得开始吐槽了,特麽这只有20行代码?哈哈,刨去初始化控件啊什么乱七八糟的,真的没有20行,亲自数过。
其他同方法实现的效果
可能有人会思考,你这现有的布局,都长的差不多,可以使用一个fragment绑定就可以了,如何使用多个fragment,绑定不同的页面呢?简单啦…
为了方便绑定数据,我们先创建一个BaseFragent的抽象类
各自的fragment继承并绑定各自的布局,关联各自的数据,互不干扰
FragmentA
FragmentB
……FragmentC、FragmentD、FragmentE、FragmentF。
修改绑定viewpager的arraylist的对象类型
添加数据
以上即可实现绑定不同的Fragment,效果如下:
源码下载
编码
补充
前言
首先上鸡汤,FlycoTabLayout,一个强大的第三方tabbar库(有各种体位,总有个姿势会让你舒适),点击查看相信你不会后悔。正如标题所说,只需要不到20行的代码,实现tabbar,菜单选择效果,先上图。
编码
首先创建一个项目布局,很简单
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tl="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.lpf.fvp.MainActivity" tools:showIn="@layout/activity_main"> <com.flyco.tablayout.SlidingTabLayout android:id="@+id/tablayout" android:layout_width="match_parent" android:layout_height="48dp" android:background="?attr/colorPrimary" tl:tl_divider_color="#1AFFFFFF" tl:tl_divider_padding="13dp" tl:tl_divider_width="1dp" tl:tl_indicator_color="#FFFFFF" tl:tl_indicator_height="1.5dp" tl:tl_indicator_width_equal_title="true" tl:tl_tab_padding="22dp" tl:tl_tab_space_equal="true" tl:tl_textSelectColor="#FFFFFF" tl:tl_textUnselectColor="#66FFFFFF" tl:tl_underline_color="#1AFFFFFF" tl:tl_underline_height="1dp" /> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
具体控件的使用请查看源项目FlycoTabLayout,有详细的介绍,在此不多说。
创建一个fragment
public class MyFragment extends Fragment { private View view; private String title; private TextView txt; public static MyFragment getInstance(String title) { MyFragment mf = new MyFragment(); mf.title = title; return mf; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_layout, container, false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initView(); } private void initView() { txt = (TextView) view.findViewById(R.id.msg); txt.setText(title); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/msg" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" /> </LinearLayout>
此处应该不存在任何疑惑,绑定布局,获取一个textview而已。
主界面,MainActivity代码实现
public class MainActivity extends AppCompatActivity { @InjectView(R.id.toolbar) Toolbar toolbar; @InjectView(R.id.tablayout) SlidingTabLayout tablayout; @InjectView(R.id.view_pager) ViewPager viewPager; @InjectView(R.id.fab) FloatingActionButton fab; private ArrayList<MyFragment> mFagments = new ArrayList<>(); private String[] mTitles = {"Tab1", "Tab2", "Tab333344", "Tab4", "Tab5", "Tab6"}; private MyPagerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); setSupportActionBar(toolbar); initView(); } private void initView() { for (String s : mTitles) { mFagments.add(MyFragment.getInstance(s)); } //getChildFragmentManager() 如果是嵌套在fragment中就要用这个 adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); tablayout.setViewPager(viewPager, mTitles); } private class MyPagerAdapter extends FragmentPagerAdapter { public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return mFagments.size(); } @Override public CharSequence getPageTitle(int position) { return mTitles[position]; } @Override public Fragment getItem(int position) { return mFagments.get(position); } } }
这里就说一下MyPagerAdapter,用于viewpager绑定fragment使用,在activity中FragmentManager通过getSupportFragmentManager()去获取,如果在是在fragment中就需要通过getChildFragmentManager()去说去。
我想又得开始吐槽了,特麽这只有20行代码?哈哈,刨去初始化控件啊什么乱七八糟的,真的没有20行,亲自数过。
其他同方法实现的效果
补充
补充说明可能有人会思考,你这现有的布局,都长的差不多,可以使用一个fragment绑定就可以了,如何使用多个fragment,绑定不同的页面呢?简单啦…
为了方便绑定数据,我们先创建一个BaseFragent的抽象类
public abstract class BaseFragment extends Fragment { public abstract int getLayoutID(); public abstract void initView(); public View view; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(getLayoutID(), container, false); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initView(); } }
各自的fragment继承并绑定各自的布局,关联各自的数据,互不干扰
FragmentA
public class FragmentA extends BaseFragment { private String title; private TextView txt; @Override public int getLayoutID() { return R.layout.fragment_layout_a; } @Override public void initView() { txt = (TextView) view.findViewById(R.id.msg); txt.setText("FragmentA:" + title); } public static FragmentA getInstance(String title) { FragmentA mf = new FragmentA(); mf.title = title; return mf; } }
FragmentB
public class FragmentB extends BaseFragment { private String title; private TextView txt; @Override public int getLayoutID() { return R.layout.fragment_layout_b; } @Override public void initView() { txt = (TextView) view.findViewById(R.id.msg); txt.setText("FragmentB:" + title); } public static FragmentB getInstance(String title) { FragmentB mf = new FragmentB(); mf.title = title; return mf; } }
……FragmentC、FragmentD、FragmentE、FragmentF。
修改绑定viewpager的arraylist的对象类型
private ArrayList<BaseFragment> mFagments = new ArrayList<>();
添加数据
//for (String s : mTitles) { // mFagments.add(MyFragment.getInstance(s)); //} mFagments.add(FragmentA.getInstance(mTitles[0])); mFagments.add(FragmentB.getInstance(mTitles[1])); mFagments.add(FragmentC.getInstance(mTitles[2])); mFagments.add(FragmentD.getInstance(mTitles[3])); mFagments.add(FragmentE.getInstance(mTitles[4])); mFagments.add(FragmentF.getInstance(mTitles[5]));
以上即可实现绑定不同的Fragment,效果如下:
源码下载
相关文章推荐
- 底部Popwindow形式菜单的类的封装
- 一步一步跟我学易语言之第二个易程序菜单设计
- IE右键菜单被修改
- jQuery菜单插件用法实例
- ASP动态级联菜单实现代码
- jQuery实现的超酷苹果风格图标滑出菜单效果代码
- Div+Js实现的带阴影菜单 微软以前网站曾用过
- Extjs学习笔记之四 工具栏和菜单
- C#实现基于XML配置MenuStrip菜单的方法
- Android App开发中ViewPager组件的入门使用教程
- 基于jQuery倾斜打开侧边栏菜单特效代码
- jQuery实现美观的多级动画效果菜单代码
- 无限级别菜单的实现
- jquery实现向下滑出的二级导航下滑菜单效果
- 基于jQuery实现以手风琴方式展开和折叠导航菜单
- CSS图片翻转菜单
- JS实现自动变换的菜单效果代码
- JS+CSS实现六级网站导航主菜单效果
- jQuery实现可关闭固定于底(顶)部的工具条菜单效果
- js实现的简洁网页滑动tab菜单效果代码