Android中Fragment+ViewPager的配合使用

官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例。FragmentPagerAdapterFragmentStatePagerAdapter这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。

 

适配器类:

 


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的区别在于它有自己的生命周期,可以随时更改自己的状态便于管理。

 

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

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

原文 http://smallwoniu.blog.51cto.com/3911954/1322746

时间: 2024-10-25 04:27:00

Android中Fragment+ViewPager的配合使用的相关文章

Android中fragment+viewpager实现布局

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1.先布局实现mian.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/

Android中在ViewPager+Fragment中有两个Fragment

问题描述 Android中在ViewPager+Fragment中有两个Fragment 一个有ListView,一个有dialogdialog中有个edittext,然后edittext获取到焦点是,第一个Fragment中的getVIew会运行,为什么 解决方案 android中 Fragment中的viewpagerAndroid:fragment中嵌套viewpager,vierpager中有多个fragment 解决方案二: http://www.cnblogs.com/android

android中fragment和activity

问题描述 android中fragment和activity 我在MainActivity用了一个viewpager包裹了四个fragment ->> fragment1 fragment2 fragment3 fragment4 在fragment4中有一个按钮 点击按钮调转到登陆的Activity->>>LoginActivity 在LoginActivity 中 输入用户名和密码 登陆成功之后 又会重新回到 MainActivity中的fragment4的那个页面 但是

界面-Android中Fragment怎样重新加载UI

问题描述 Android中Fragment怎样重新加载UI 有这么一个需求:我从AFragment跳转到了一个Activity,在这个Activity中我做了一些操作(这些操作会让AFragment中使用的数据发生变化,从而选择不同的视图UI),然后点击回退按钮时,我希望AFragment中的界面能够根据Activity中的操作而变化.大神们,帮忙看看! 解决方案 考虑下用事件总线,有两个比较好的库EventBus和Otto 解决方案二: 感觉楼上的方法比较合理,但也可以用比较粗暴的广播的方法

android中fragment切换的时候遇到非法参数异常的问题

问题描述 android中fragment切换的时候遇到非法参数异常的问题 FragmentTabHost中加入了两个fragment,片段1和片段2.运行后从片段1到片段2没有出问题,当从片段2再回到片段1的时候出现非法参数异常. 异常代码如图 找到错误主要原因是设置了一个布局的ID: gridview_layout.setId(CAL_LAYOUT_ID); 请问为什么在fragment中设置id切换片段后会发生异常? 解决方案 你这两个页面的id相同 但是页面不是同一种类型的 有冲突

Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果_Android

之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie

Android 中 Fragment的使用大全_Android

 Fragment必须总是被嵌入到一个Activity中,并且它的生命周期直接受宿主Activity生命周期的影响. 本文内容可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 在一个Activity中,一个Fragment代表一种行为或者用户界面的一部分.你可以联合起来多个Fragment在一个Activity中创建多面板的UI,并且可以重用一个Fragment在多个activity中.你可以认为一个Fragment是一个Activi

Android 中 Fragment的使用大全

Fragment必须总是被嵌入到一个Activity中,并且它的生命周期直接受宿主Activity生命周期的影响. 本文内容可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 在一个Activity中,一个Fragment代表一种行为或者用户界面的一部分.你可以联合起来多个Fragment在一个Activity中创建多面板的UI,并且可以重用一个Fragment在多个activity中.你可以认为一个Fragment是一个Activit

Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载. ViewPager是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.而viewpager就是其中之一,利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等. 下面我们就展示下Vie