Android ViewPager+Fragment

来源:互联网 发布:阿里云金融云vpc专线 编辑:程序博客网 时间:2024/06/13 11:59

今天跟着视频的脚步,在学习完了简单的ViewPager之后,又紧接着学习了Viewpager+Fragment,即Fragment的复杂的页面显示,之所以称之为复杂的页面显示,主要是:1.允许放置Fragment,当Fragment存在,功能可以实现非常复杂,完善的功能,现代的客户端都会包含ViewPager+Fragment,由此可见非常重要。
那么如何去实现呢?其实和简单的ViewPager很相似,只不过不再是借助于PagerAdapter这个类去实现了,而是借助于FragmentPagerAdapter以及FragmentStatePagerAdapter两个适配器来进行ViewPager包含Fragment操作,这里主要是讲解使用FragmentPagerAdapter这个适配器来实现。
我们为了学习的方便,以模拟实现内涵段子的界面为背景进行学习的,主要是实现了页面的切换以及后期实现了RadioButton与ViewPager的交互,即点击哪一个相应的RadioButton,ViewPager将会跳转至哪一个界面,注意,我们只是实现了单方面的联动,只是RadioButton可以控制ViewPager,而ViewPager操控RadioButton笔者还没有实现。由于代码已经比较详细,这里直接上代码。
由于建立的文件比较多,先把类文件给大家看一下:
这里写图片描述
NeihanActivity.java的代码:

public class NeihanActivity extends FragmentActivity implements RadioGroup.OnCheckedChangeListener {    private ViewPager pager;    //需要实现的Fragment    private List<Fragment> fragments;   //用于切换ViewPager    private RadioGroup pagerSelector;    public NeihanActivity()    {    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_neihan);        pager=(ViewPager)findViewById(R.id.neihan_viewpager);        //!使用FragmentPagerAdapter来设置ViewPager的内容        //让每一个页面可以是Fragment        fragments=new ArrayList<>();        fragments.add(new ChapterFragment());        fragments.add(new ImageFragment());        fragments.add(new SettingsFragment());        NeihanFragmentPagerAdapter adapter=                new NeihanFragmentPagerAdapter(getSupportFragmentManager()                ,fragments);        pager.setAdapter(adapter);        //RadioGroup        pagerSelector=(RadioGroup) findViewById(R.id.pager_selector);        pagerSelector.setOnCheckedChangeListener(this);    }    /**     *     * @param group     * @param checkedId     */    @Override    public void onCheckedChanged(RadioGroup group, int checkedId) {        //获取当前容器内部有多少个子控件        int count=group.getChildCount();        int checkedPos=0;        //遍历RadioGroup中的每一个RadioButton,看看第一个选中了        //因为ViewPager 设置显示页面,需要指定的是索引        for (int i=0;i<count;i++)        {            View v=group.getChildAt(i);            if(v instanceof RadioButton)            {                RadioButton rb=(RadioButton) v;                boolean checked=rb.isChecked();                if(checked)                {                    checkedPos=i;                    //因为每次只能显示一页,所以只有一个按钮处于选中状态                    //直接跳出循环就可以                    break;                }            }        }        //设置ViewPager显示第几页,有过渡效果        //pager.setCurrentItem(checkedPos);        //第二个参数的意思是是否有平滑滚动        pager.setCurrentItem(checkedPos,false);    }}

NeihanFragmentPagerAdapter的代码:

public class NeihanFragmentPagerAdapter extends FragmentPagerAdapter {   //默认构造函数一定要有    //两步实现:Ctrl i  Ctrl O    private List<Fragment> fragments;    /**     * 默认构造方法,当中的FragmentManager 一定是上一级组件的Manager     * 例如Activity包含的ViewPager 指定Adapter时候,     *      通过getSupportFragment,     *例如在Fragment内部使用的ViewPager,那么 ViewPager Adapter     *     应该是getChildFragmentManager()     * @param fm     */    public NeihanFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragments) {        super(fm);        this.fragments=fragments;    }    /**     * 获取第几页的Fragment     * @param position     * @return     */    @Override    public Fragment getItem(int position) {        return fragments.get(position);    }    /**     * 获取页面的个数     * @return     */    @Override    public int getCount() {        return fragments.size();    }}

ChapterFragment的代码:

public class ChapterFragment extends Fragment {    public ChapterFragment()    {    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {          View view=inflater.inflate(R.layout.fragment_chapter,container,false);        return view;    }}

ImageFragment的代码:

public class ImageFragment extends Fragment {      public ImageFragment()      {      }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        View view=inflater.inflate(R.layout.fragment_image,container,false);        return view;    }}

SettingsFragment的代码:

public class SettingsFragment extends Fragment {    public  SettingsFragment()    {    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        View view=inflater.inflate(R.layout.fragment_settings,container,false);        return view;    }}

activity.xml代码:

  <TextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:textColor="#f00"        android:textSize="30sp"        android:text="内涵"/>    <android.support.v4.view.ViewPager        android:id="@+id/neihan_viewpager"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1"        >    </android.support.v4.view.ViewPager>        <RadioGroup            android:id="@+id/pager_selector"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:orientation="horizontal">            <RadioButton             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:text="段子"/>            <RadioButton             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:text="图片"/>            <RadioButton             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:text="设置"/>        </RadioGroup>

三个Fragment中就只是一个TextView的控件,这里就不再显示出来,自己添加就可以,当然这里只是为了测试,所以才将Fragement写的这么简单,自己可以根据需求添加一些复杂的功能。
好了,今天就学习了这么多,明天将会学习ViewPager的生命周期,如果时间充足将会进行服务的学习,明天又是新的一天,加油!!!

0 0