Android中Fragment+ViewPager的配合使用
2015-06-14 15:22
453 查看
原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下,(http://www.it165.net/pro/html/201310/7454.html)今天我将继续总结,关于Fragment+ViewPager的使用!
官方文档:http://developer.android.com/reference/android/support/v4/view/ViewPager.html
ViewPager is most often used in conjunction with Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These
are FragmentPagerAdapter andFragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.
这里大家可以回忆一下如果像上篇中介绍ViewPager的使用,叶片填充数据是Layout,页面少的话还可以,如果页面过多的话,全部加载到手机内存中,可能会耗尽内存,手动销毁又太麻烦。官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例。FragmentPagerAdapter和FragmentStatePagerAdapter这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。
适配器类:
view
sourceprint?
MyFragment类:
view
sourceprint?
布局文件:
activity_main.xml
view
sourceprint?
fragment_pager_list.xml
view
sourceprint?
MainActivity类:
view
sourceprint?
效果图:
效果与ViewPager中添加View的效果是一样的!但是它与View的区别在于它有自己的生命周期,可以随时更改自己的状态便于管理。
事实上使用FragmentPagerAdapter 时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用FragmentPagerAdapter了,FragmentPagerAdapter 适用于只有少数的page情况,像选项卡。
这个时候你可以考虑使用FragmentStatePagerAdapter ,当使用FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,(滑过后会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉)
但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,FragmentStatePagerAdapter 比较适合页面比较多的情况,像一个页面的ListView 。
1、在ActionBar中进行Fragment之间的切换
2、Android Fragments基础教程
3、Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
4、Android笔记:Fragment相关问题
5、Xamarin简单使用Fragment静态篇
6、Xamarin动态加载Fragment
7、ActionBar通过Tab进行不同的Fragment之间的交换
8、Android中强大的适配功能 Fragment(碎片)总结
官方文档:http://developer.android.com/reference/android/support/v4/view/ViewPager.html
ViewPager is most often used in conjunction with Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These
are FragmentPagerAdapter andFragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.
这里大家可以回忆一下如果像上篇中介绍ViewPager的使用,叶片填充数据是Layout,页面少的话还可以,如果页面过多的话,全部加载到手机内存中,可能会耗尽内存,手动销毁又太麻烦。官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例。FragmentPagerAdapter和FragmentStatePagerAdapter这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。
适配器类:
view
sourceprint?
01.
package
com.zhf.android_viewpager_fragment;
02.
import
android.support.v4.app.Fragment;
03.
import
android.support.v4.app.FragmentManager;
04.
import
android.support.v4.app.FragmentPagerAdapter;
05.
/**
06.
* 自定义fragment适配器
07.
* @author ZHF
08.
*
09.
*/
10.
public
class
MyFragmentPageAdapter
extends
FragmentPagerAdapter {
11.
public
MyFragmentPageAdapter(FragmentManager fm) {
12.
super
(fm);
13.
}
14.
@Override
15.
public
int
getCount() {
16.
return
3
;
17.
}
18.
@Override
19.
public
Fragment getItem(
int
position) {
20.
switch
(position) {
21.
case
0
:
22.
return
MyFragment.newInstance(position);
23.
case
1
:
24.
return
MyFragment.newInstance(position);
25.
case
2
:
26.
return
MyFragment.newInstance(position);
27.
default
:
28.
return
null
;
29.
}
30.
}
31.
}
MyFragment类:
view
sourceprint?
01.
package
com.zhf.android_viewpager_fragment;
02.
import
android.os.Bundle;
03.
import
android.support.v4.app.Fragment;
04.
import
android.view.LayoutInflater;
05.
import
android.view.View;
06.
import
android.view.ViewGroup;
07.
import
android.widget.TextView;
08.
/**
09.
* 用于创建Fragment对象,作为ViewPager的叶片
10.
* @author ZHF
11.
*
12.
*/
13.
public
class
MyFragment
extends
Fragment {
14.
15.
int
mNum;
//页号
16.
public
static
MyFragment newInstance(
int
num) {
17.
MyFragment fragment =
new
MyFragment();
18.
// Supply num input as an argument.
19.
Bundle args =
new
Bundle();
20.
args.putInt(
"num"
, num);
21.
fragment.setArguments(args);
22.
return
fragment;
23.
}
24.
@Override
25.
public
void
onCreate(Bundle savedInstanceState) {
26.
super
.onCreate(savedInstanceState);
27.
//这里我只是简单的用num区别标签,其实具体应用中可以使用真实的fragment对象来作为叶片
28.
mNum = getArguments() !=
null
? getArguments().getInt(
"num"
) :
1
;
29.
}
30.
/**为Fragment加载布局时调用**/
31.
@Override
32.
public
View onCreateView(LayoutInflater inflater, ViewGroup container,
33.
Bundle savedInstanceState) {
34.
35.
View view = inflater.inflate(R.layout.fragment_pager_list,
null
);
36.
TextView tv = (TextView) view.findViewById(R.id.text);
37.
tv.setText(
"fragment+"
+ mNum);
38.
return
view;
39.
}
40.
}
布局文件:
activity_main.xml
view
sourceprint?
01.
<
RelativeLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
02.
xmlns:tools
=
"http://schemas.android.com/tools"
03.
android:layout_width
=
"match_parent"
04.
android:layout_height
=
"match_parent"
>
05.
06.
<
android.support.v4.view.ViewPager
07.
android:id
=
"@+id/viewpager"
08.
android:layout_width
=
"fill_parent"
09.
android:layout_height
=
"fill_parent"
/>
10.
</
RelativeLayout
>
fragment_pager_list.xml
view
sourceprint?
01.
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
02.
android:layout_width
=
"match_parent"
03.
android:layout_height
=
"match_parent"
04.
android:background
=
"@android:drawable/gallery_thumb"
05.
android:orientation
=
"vertical"
>
06.
<
TextView
07.
android:id
=
"@+id/text"
08.
android:layout_width
=
"match_parent"
09.
android:layout_height
=
"wrap_content"
10.
android:gravity
=
"center_vertical|center_horizontal"
11.
android:text
=
"@string/hello_world"
12.
android:textAppearance
=
"?android:attr/textAppearanceMedium"
/>
13.
</
LinearLayout
>
MainActivity类:
view
sourceprint?
01.
package com.zhf.android_viewpager_fragment;
02.
import android.os.Bundle;
03.
import android.support.v4.app.FragmentActivity;
04.
import android.support.v4.app.FragmentManager;
05.
import android.support.v4.view.ViewPager;
06.
public
class
MainActivity extends FragmentActivity {
07.
private
ViewPager mViewPager;
08.
private
MyFragmentPageAdapter mAdapter;
09.
@Override
10.
protected
void
onCreate(Bundle savedInstanceState) {
11.
super.onCreate(savedInstanceState);
12.
setContentView(R.layout.activity_main);
13.
mViewPager = (ViewPager) findViewById(R.id.viewpager);
14.
15.
//这里因为是3.0一下版本,所以需继承FragmentActivity,通过getSupportFragmentManager()获取FragmentManager
16.
//3.0及其以上版本,只需继承Activity,通过getFragmentManager获取事物
17.
FragmentManager fm = getSupportFragmentManager();
18.
//初始化自定义适配器
19.
mAdapter =
new
MyFragmentPageAdapter(fm);
20.
//绑定自定义适配器
21.
mViewPager.setAdapter(mAdapter);
22.
}
23.
}
效果图:
效果与ViewPager中添加View的效果是一样的!但是它与View的区别在于它有自己的生命周期,可以随时更改自己的状态便于管理。
事实上使用FragmentPagerAdapter 时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用FragmentPagerAdapter了,FragmentPagerAdapter 适用于只有少数的page情况,像选项卡。
这个时候你可以考虑使用FragmentStatePagerAdapter ,当使用FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,(滑过后会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉)
但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,FragmentStatePagerAdapter 比较适合页面比较多的情况,像一个页面的ListView 。
延伸阅读:
1、在ActionBar中进行Fragment之间的切换2、Android Fragments基础教程
3、Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
4、Android笔记:Fragment相关问题
5、Xamarin简单使用Fragment静态篇
6、Xamarin动态加载Fragment
7、ActionBar通过Tab进行不同的Fragment之间的交换
8、Android中强大的适配功能 Fragment(碎片)总结
相关文章推荐
- Android进程机制五大进程
- Android学习 StateMachine与State模式
- mark—android返回键
- Android之各种Adapter
- Android 学习笔记之SurfaceView的使用+如何实现视频播放...
- Android更改工程名称
- Android Service(一)
- Android自定义View 构造方法 遇到的一些问题
- android webservices使用教程及遇到问题总结
- android安卓Jni编译提示fatal error: vector: No such file or directory
- Android学习 6->浅谈界面显示与LayoutInflater
- AndroidADT如何签名打包问题详解
- android程序运行至某个界面,按Home键退出程序界面;再进去,程序重新启动。解决办法
- 关于android-common开源框架的使用
- Android开发Bitmap在Native层与Java层内存的两种生成方式
- android static对内存的影响
- Android各种layout布局
- 在Android中使用Java 8的lambda表达式
- FaceBook/infer-分析Android项目
- Android SD卡文件读写目录及权限