博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【移动开发】Android中Fragment+ViewPager的配合使用
阅读量:5872 次
发布时间:2019-06-19

本文共 4972 字,大约阅读时间需要 16 分钟。

原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下,()今天我将继续总结,关于Fragment+ViewPager的使用!

官方文档:

ViewPager is most often used in conjunction with , 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  and; each of these classes have simple code showing how to build a full user interface with them.


这里大家可以回忆一下如果像上篇中介绍ViewPager的使用,叶片填充数据是Layout,页面少的话还可以,如果页面过多的话,全部加载到手机内存中,可能会耗尽内存,手动销毁又太麻烦。官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例。这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。


适配器类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package 
com.zhf.android_viewpager_fragment;
import 
android.support.v4.app.Fragment;
import 
android.support.v4.app.FragmentManager;
import 
android.support.v4.app.FragmentPagerAdapter;
/**
 
* 自定义fragment适配器
 
* @author ZHF
 
*
 
*/
public 
class 
MyFragmentPageAdapter 
extends 
FragmentPagerAdapter {
    
public 
MyFragmentPageAdapter(FragmentManager fm) {
        
super
(fm);
    
}
    
@Override
    
public 
int 
getCount() {
        
return 
3
;
    
}
    
@Override
    
public 
Fragment getItem(
int 
position) {
        
switch 
(position) {
         
case 
0
:
                
return 
MyFragment.newInstance(position);
            
case 
1
:
                
return 
MyFragment.newInstance(position);
            
case 
2
:
                
return 
MyFragment.newInstance(position);
            
default
:
                
return 
null
;
            
}
    
}
}


MyFragment类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package 
com.zhf.android_viewpager_fragment;
import 
android.os.Bundle;
import 
android.support.v4.app.Fragment;
import 
android.view.LayoutInflater;
import 
android.view.View;
import 
android.view.ViewGroup;
import 
android.widget.TextView;
/**
 
* 用于创建Fragment对象,作为ViewPager的叶片
 
* @author ZHF
 
*
 
*/
public 
class 
MyFragment 
extends 
Fragment {
                                                                                                                                                                                                                                                                                                                  
    
int 
mNum; 
//页号
    
public 
static 
MyFragment newInstance(
int 
num) {
        
MyFragment fragment = 
new 
MyFragment();
        
// Supply num input as an argument.
        
Bundle args = 
new 
Bundle();
        
args.putInt(
"num"
, num);
        
fragment.setArguments(args);
        
return 
fragment;
    
}
    
@Override
    
public 
void 
onCreate(Bundle savedInstanceState) {
        
super
.onCreate(savedInstanceState);
        
//这里我只是简单的用num区别标签,其实具体应用中可以使用真实的fragment对象来作为叶片
        
mNum = getArguments() != 
null 
? getArguments().getInt(
"num"
) : 
1
;
    
}
    
/**为Fragment加载布局时调用**/
    
@Override
    
public 
View onCreateView(LayoutInflater inflater, ViewGroup container,
            
Bundle savedInstanceState) {
                                                                                                                                                                                                                                                                                                                      
        
View view = inflater.inflate(R.layout.fragment_pager_list, 
null
);
        
TextView tv = (TextView) view.findViewById(R.id.text);
        
tv.setText(
"fragment+" 
+ mNum);
        
return 
view;
    
}
}


布局文件:


activity_main.xml

1
2
3
4
5
6
7
8
9
10
<RelativeLayout 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.support.v4.view.ViewPager
        
android:id=
"@+id/viewpager"
        
android:layout_width=
"fill_parent"
        
android:layout_height=
"fill_parent" 
/>
</RelativeLayout>

fragment_pager_list.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
    
android:layout_width=
"match_parent"
    
android:layout_height=
"match_parent"
    
android:background=
"@android:drawable/gallery_thumb"
    
android:orientation=
"vertical" 
>
    
<TextView
        
android:id=
"@+id/text"
        
android:layout_width=
"match_parent"
        
android:layout_height=
"wrap_content"
        
android:gravity=
"center_vertical|center_horizontal"
        
android:text=
"@string/hello_world"
        
android:textAppearance=
"?android:attr/textAppearanceMedium" 
/>
</LinearLayout>


MainActivity类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package 
com.zhf.android_viewpager_fragment;
import 
android.os.Bundle;
import 
android.support.v4.app.FragmentActivity;
import 
android.support.v4.app.FragmentManager;
import 
android.support.v4.view.ViewPager;
public 
class 
MainActivity 
extends 
FragmentActivity {
    
private 
ViewPager mViewPager;
    
private 
MyFragmentPageAdapter mAdapter;
    
@Override
    
protected 
void 
onCreate(Bundle savedInstanceState) {
        
super
.onCreate(savedInstanceState);
        
setContentView(R.layout.activity_main);
        
mViewPager = (ViewPager) findViewById(R.id.viewpager);
                                                                                                                                                                                                                                 
        
//这里因为是3.0一下版本,所以需继承FragmentActivity,通过getSupportFragmentManager()获取FragmentManager
        
//3.0及其以上版本,只需继承Activity,通过getFragmentManager获取事物
        
FragmentManager fm = getSupportFragmentManager();
        
//初始化自定义适配器
        
mAdapter =  
new 
MyFragmentPageAdapter(fm);
        
//绑定自定义适配器
        
mViewPager.setAdapter(mAdapter);
    
}
}


效果图:

效果与ViewPager中添加View的效果是一样的!但是它与View的区别在于它有自己的生命周期,可以随时更改自己的状态便于管理。


事实上使用 时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用了, 适用于只有少数的page情况,像选项卡

这个时候你可以考虑使用 ,当使用 时,如果Fragment不显示,那么Fragment对象会被销毁,(滑过后会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉
但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,
 比较适合页面比较多的情况,像一个页面的ListView 。


     本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1322746,如需转载请自行联系原作者




你可能感兴趣的文章
SCCM 2016 配置管理系列(Part8)
查看>>
zabbix监控部署
查看>>
关于Tomcat下项目中文名在Windows和Linux下编码混乱问题解决
查看>>
struts中的xwork源码下载地址
查看>>
Android硬件抽象层(HAL)深入剖析(二)
查看>>
CDays–4 习题一至四及相关内容解析。
查看>>
L3.十一.匿名函数和map方法
查看>>
前端自动化构建工具webpack (一)之webpack安装 和 设置webpack.confi.js
查看>>
java面向对象高级分层实例_实体类
查看>>
Guice 练习 constructorbindings demo
查看>>
android aapt 用法 -- ApkReader
查看>>
[翻译]用 Puppet 搭建易管理的服务器基础架构(3)
查看>>
Android -- AudioPlayer
查看>>
Python大数据依赖包安装
查看>>
Android View.onMeasure方法的理解
查看>>
Node.js 爬虫初探
查看>>
ABP理论学习之仓储
查看>>
centos7下使用yum安装mysql
查看>>
How can I set ccshared=-fPIC while executing ./configure?
查看>>
2.移植uboot-添加2440单板,并实现NOR、NAND启动
查看>>