因近些端开发的app项目的老师使用到在Fragment中放ViewPager,ViewPager中再套用Fragment,指示器经常用第三方的也没有新意,看到网上的大神好多种方法实现,就琢磨者能不能自己写一个,说干就干,因博客写的少,若是有问题请及时指点:
第一步:MainActivity的布局就是一个FrameLayout容器,
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/fl_container" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> </LinearLayout>
抽取的BaseFragmentViewPager,布局文件
<?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" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <!--这个是系统自带的指示器--> <android.support.design.widget.TabLayout android:id="@+id/table_layout1" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabIndicatorColor="#24CF5F" app:tabIndicatorHeight="3dp" app:tabSelectedTextColor="#24CF5F" app:tabTextColor="#666666"> </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> </LinearLayout>
第二步:BaseFragmentViewPager的主体内容
public abstract class BaseFragmentVR extends Fragment { private ViewPager mViewPager; private TabLayout tabLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = View.inflate(getActivity(), R.layout.base_fragmet_vr, null); //初始化指示器 和 Viewpager tabLayout = (TabLayout) view.findViewById(R.id.table_layout1); mViewPager = (ViewPager) view.findViewById(R.id.view_pager); return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //创建适配器 FragmentVrAdapter adapter = new FragmentVrAdapter(getChildFragmentManager(),mViewPager); //给viewpager设置适配器 mViewPager.setAdapter(adapter); //关联指示器 tabLayout.setupWithViewPager(mViewPager); //提供一个方法,让子类完成 setFragmentData(adapter); } //这个方法是用来给子类完善标题,数据的 protected abstract void setFragmentData(FragmentVrAdapter adapter); public Bundle getBundle(String str) { Bundle bundle = new Bundle(); bundle.putString("key", str); return bundle; }}
第三步:ViewPager的适配器
//创建适配器 protected class FragmentVrAdapter extends FragmentStatePagerAdapter{ //初始化一个上下文,用来创建fragment对象 private Context mContext; //创建一个集合用来存放pagerTable; List<PagerTab> tab = new ArrayList<>(); //既然有内部类的pagerTab,就需要对外提供一个设置pagerTab的方法 public void addTab(String title,Class<?> clazz,Bundle bundle){ //将传入的标题,字节码,封装成一个pagertab PagerTab pagerTab = new PagerTab(title,clazz,bundle); //存在集合中 tab.add(pagerTab); //一定要记得刷新适配器 notifyDataSetChanged(); } public FragmentVrAdapter(FragmentManager fm, ViewPager v) { //构造方法 super(fm); mContext=v.getContext(); //初始化上下文 } @Override public Fragment getItem(int position) { Class<?> clazz = tab.get(position).clazz; //拿到封装的字节码 Bundle bundle = tab.get(position).bundle; Fragment fragment = Fragment.instantiate(mContext,clazz.getName(),bundle); return fragment; //通过fragment的字节码生成fragmnet对象 } @Override public int getCount() { return tab.size(); //页面的数量 } @Override public CharSequence getPageTitle(int position) { return tab.get(position).title; //从疯转的类中拿到指示器的标题 } //创建一个内部类,用来封装 指示器的标题,fragment的字节码,以及要传输的的内容 class PagerTab{ String title; Class<?> clazz; Bundle bundle; //给出一个参的构造方法 public PagerTab(String title, Class<?> clazz, Bundle bundle) { this.title = title; this.clazz = clazz; this.bundle = bundle; } } }
第四步:创建的ViewPager,直接继承BaseFragmentViewpager
public class MessageViewPager extends BaseFragmentVR { @Override protected void setFragmentData(FragmentVrAdapter adapter) { adapter.addTab("精彩", WonderFragment.class,getBundle("精彩的页面")); adapter.addTab("篮球", BasketballFragment.class,getBundle("篮球的页面")); adapter.addTab("详情", WonderFragment.class,getBundle("详情的页面")); } }
wonderfragment,BasketballFragment,WonderFragment是自己创建的一个fragmnet,这里只是为了显示内容
第五步:在MainActivity中进行替换
public class MainActivity extends AppCompatActivity { private FrameLayout fl_container; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fl_container = (FrameLayout) findViewById(R.id.fl_container); getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,new MessageViewPager()).commit(); } }