Android中Fragment+ViewPager的配合使用

时间:2022-04-23
本文章向大家介绍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 。