自定义的ViewPager+Fragment填充的效果实现,简单明了,通俗易懂

因近些端开发的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();
    }
}
 

 
 
 
 
 
 
 
 
 
 
 
 
 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值