ViewPager 详解(五)—–使用Fragment实现ViewPager滑动[通俗易懂]

ViewPager 详解(五)—–使用Fragment实现ViewPager滑动[通俗易懂]前言:前几篇文章讲解了ViewPager的普通实现方法,但android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager详解(一)—基本入门》所实现的效果。系列文章:1、《ViewPager详解(一)—基本入门》2、《ViewPager详解(二)—详解四大函数》3、《ViewPage…

大家好,又见面了,我是你们的朋友全栈君。

前言:前几篇文章讲解了ViewPager的普通实现方法,但android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager 详解(一)—基本入门》所实现的效果。

 

系列文章:

 

1、《ViewPager 详解(一)—基本入门》

2、《ViewPager 详解(二)—详解四大函数》

3、《ViewPager 详解(三)—PagerTabStrip与PagerTitleStrip添加标题栏的异同》

4、《ViewPager 详解(四)—-自主实现滑动指示条》

其它相关文章:

5、《Android Fragment完全解析,关于碎片你所需知道的一切》

6、《fragment中嵌套viewpager,vierpager中有多个fragment》

 

本篇效果图:

在第一个页面加一个Btn                                          第一页面向第二页面滑动

ViewPager 详解(五)-----使用Fragment实现ViewPager滑动[通俗易懂]  ViewPager 详解(五)-----使用Fragment实现ViewPager滑动[通俗易懂]

         第二页面向第三个页面滑动

ViewPager 详解(五)-----使用Fragment实现ViewPager滑动[通俗易懂]

一、概述

从前面几篇文章,我们知道,实现ViewPager是要有适配器的,我们前面用的适配器是PagerAdapter,而对于fragment,它所使用的适配器是:FragmentPagerAdapter.先看看官方对于这个类的解释:(英文下面有中文解释)

原文:

 

Class Overview


 

Implementation of PagerAdapter that represents each page as a Fragment that is persistently kept in the fragment manager as long as the user can return to the page.

This version of the pager is best for use when there are a handful of typically more static fragments to be paged through, such as a set of tabs. The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible. This can result in using a significant amount of memory since fragment instances can hold on to an arbitrary amount of state. For larger sets of pages, consider FragmentStatePagerAdapter.

When using FragmentPagerAdapter the host ViewPager must have a valid ID set.

Subclasses only need to implement getItem(int) and getCount() to have a working adapter.

译文:(译的不好,大家可在评论中补充)

FragmentPagerAdapter派生自PagerAdapter,它是用来呈现Fragment页面的,这些Fragment页面会一直保存在fragment manager中,以便用户可以随时取用。

这个适配器最好用于有限个静态fragment页面的管理。尽管不可见的视图有时会被销毁,但用户所有访问过的fragment都会被保存在内存中。因此fragment实例会保存大量的各种状态,这就造成了很大的内存开销。所以如果要处理大量的页面切换,建议使用FragmentStatePagerAdapter.

每一个使用FragmentPagerAdapter的ViewPager都要有一个有效的ID集合,有效ID的集合就是Fragment的集合(感谢夫诸同学的提示)

对于FragmentPagerAdapter的派生类,只需要重写getItem(int)和getCount()就可以了。

二、具体实现

 

1、适配器实现——FragmentPagerAdapter

先看完整代码,再细讲:

 

public class FragAdapter extends FragmentPagerAdapter {

	private List<Fragment> mFragments;
	
	public FragAdapter(FragmentManager fm,List<Fragment> fragments) {
		super(fm);
		// TODO Auto-generated constructor stub
		mFragments=fragments;
	}

	@Override
	public Fragment getItem(int arg0) {
		// TODO Auto-generated method stub
		return mFragments.get(arg0);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mFragments.size();
	}

}

这里有三个函数,根据第一部分的官方文档,可知,对于FragmentPagerAdapter的派生类,只重写getItem(int)和getCount()就可以了。

 

对于构造函数,这里申请了一个Fragment的List对象,用于保存用于滑动的Fragment对象,并在创造函数中初始化:

 

public FragAdapter(FragmentManager fm,List<Fragment> fragments) {
	super(fm);
	// TODO Auto-generated constructor stub
	mFragments=fragments;
}

然后在getItem(int arg0)中,根据传来的参数arg0,来返回当前要显示的fragment,下面是getItem的官方解释,难度不大,不再细讲。

 

public abstract Fragment getItem (int position)

Return the Fragment associated with a specified position.

最后,getCount()返回用于滑动的fragment总数;

从构造函数所以看出,我们要构造Fragment的集合才行,所以下面我们就先产生我们所需要的Fragment类;

 

2、三个Fragment类

第一个Fragment类:

XML:(layout1.xml)

 

<?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:background="#ffffff"
    android:orientation="vertical" >
    
    <Button android:id="@+id/fragment1_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="show toast"
        />
</LinearLayout>

在其中加入了一个Btn

 

 

 

 

 

Java代码:

 

public class Fragment1 extends Fragment {
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view= inflater.inflate(R.layout.layout1, container, false);
		
		//对View中控件的操作方法
		Button btn = (Button)view.findViewById(R.id.fragment1_btn);
		btn.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(getActivity(), "点击了第一个fragment的BTN", Toast.LENGTH_SHORT).show();
			}
		});
		return view;
	}
}

在onCreateView()中返回要显示的View,上面这段代码简单演示了如何对视图里的控件进行操作,难度不大,不再细讲,如果对Fragment不太熟悉的同学,先看看这篇文章:《Android Fragment完全解析,关于碎片你所需知道的一切》

 

 

 

 

 

第二个Fragment类:

XML代码:(layout2.xml)原生代码,没有做任何更改

 

<?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:background="#ffff00"
    android:orientation="vertical" >
    

</LinearLayout>

java代码:

 

public class Fragment2 extends Fragment {
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view=inflater.inflate(R.layout.layout2, container, false);
		return view;
	}

}

第三个Fragment类:

 

XML代码:(layout3.xml)同样,原生代码,没做任何更改

 

<?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:background="#ff00ff"
    android:orientation="vertical" >
    

</LinearLayout>

java代码:

 

public class Fragment3 extends Fragment {
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view=inflater.inflate(R.layout.layout3, container, false);
		return view;
	}

}

3、主activity实现

核心代码:

 

 

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //构造适配器
        List<Fragment> fragments=new ArrayList<Fragment>();
        fragments.add(new Fragment1());
        fragments.add(new Fragment2());
        fragments.add(new Fragment3()); 
        FragAdapter adapter = new FragAdapter(getSupportFragmentManager(), fragments);
        
        //设定适配器
        ViewPager vp = (ViewPager)findViewById(R.id.viewpager);
        vp.setAdapter(adapter);
    }

}

 

首先有一个最值得注意的地方:Activity派生自FragmentActivity,其实这是有关Fragment的基础知识,只有FragmentActivity才能内嵌fragment页面,普通Activity是不行的。

这段代码主要分为两步,第一步:构造适配器;第二步:设定适配器。

先看构造适配器的过程:

//构造适配器
List<Fragment> fragments=new ArrayList<Fragment>();
fragments.add(new Fragment1());
fragments.add(new Fragment2());
fragments.add(new Fragment3()); 
FragAdapter adapter = new FragAdapter(getSupportFragmentManager(), fragments);

构造一个fragment列表,然后将上面的三个Fragment类对应的实例添加进去,最后生成FragAdapter实例。
至于第二步,设定适配器,没什么好讲的。

 

 

4、可能出现的问题

问题:在MainActivity中,当写到这句:fragments.add(new Fragment1()); 向Fragment列表中添加Fragement对象实例时,会提示“无法将Fragment1()转换为fragment”

解决办法 :这是因为导入包不一致,一般的问题在于:在Fragment1中导入的是android.app.Fragment, 而在这里导入类确是:android.support.v4.app.Fragment,包不同当然无法转换,统一导入为android.support.v4.app.Fragment之后就正常了.参考文章《android之cannot convert from Fragment1 to Fragment》

 

源码下载地址:http://download.csdn.net/detail/harvic880925/7777849

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38660861  不胜感激!

 

如果你喜欢我的文章,你可能更喜欢我的公众号

启舰杂谈

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163197.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 代码走查总结[通俗易懂]

    代码走查总结[通俗易懂]什么是代码走查代码走查就是,项目开发人员在一起,对代码进行讨论。项目开发人员可以向大家阐述代码的逻辑和写代码的思路!在向别人阐述的时候,会发现做自己写的代码出现的一些问题。收获我进行代码阐述的时候,是按照功能来进行的,在阐述的过程中,我能感觉到我自己是清楚这个逻辑思路的,但是说着说着就发现了一些说不通的地方,还有一些不合理的地方。这让我突然想到了,之前出现的一个bug但是,死活不知道是…

    2022年10月25日
    0
  • NSGA2算法及其代码

    NSGA2算法及其代码本人最近研究NSGA2算法,网上有很多示例代码,但是基本没有注释,代码看起来很头疼,因此我最近把整个代码研读了一遍,并做上中文注释,希望可以帮助到一些和我一样的初学者们。贴出代码之前,首先介绍一下NSGA2遗传算法的流程图:流程图中我把每个详细的步骤用号码标出来,对应下文的代码部分。首先贴出主函数代码,对应整个流程图:functionnsga_2_optimization%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%…

    2022年5月12日
    51
  • rider激活码-激活码分享

    (rider激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlKU…

    2022年3月22日
    571
  • Spring batch批量处理框架最佳实践

    Spring batch批量处理框架最佳实践springbatch精选,一文吃透springbatch批量处理框架前言碎语批处理是企业级业务系统不可或缺的一部分,springbatch是一个轻量级的综合性批处理框架,可用于开发企业信息系统中那些至关重要的数据批量处理业务.SpringBatch基于POJO和Spring框架,相当容易上手使用,让开发者很容易地访问和利用企业级服务.springbatch具有高可扩展性的框架…

    2022年5月23日
    34
  • vmware虚拟机联网设置(win10自带虚拟机安装win7)

    1.右键“我的电脑”,选择“管理”,双击进入2.找到“”服务“”这个选项,双击进入服务3.找到如下两个服务,将这两个服务启动4.打开VMware软件,打开虚拟机的编辑=>虚拟网络配置器5.点击更改配置6.配置如下图所示,配置完后,点击确定7.随便点击一台已有虚拟机,在右侧的弹框中,选择编辑虚拟机配置8.配置如下图所示,网络适配器=>选择自定义特定虚拟网=…

    2022年4月12日
    97
  • php7.1 ,7.2 多版本共存,同一台电脑不同项目使用不通PHP版本

    php7.1 ,7.2 多版本共存,同一台电脑不同项目使用不通PHP版本

    2022年2月18日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号