1、ViewPager嵌套Fragment的重点
(1)Activity继承了V4包下的FragmentActivity
(2)数据源中的List<View> 变成了List<Fragment>
初始化数据源的时候需要将数据使用fragment.setArguments(bundle)传入fragment中(3)V4包下在Activity中获取FragmentManager时需要使用getSupportFragmentManager()方法
(4)自定义的PagerAdapter需要继承FragmentPagerAdapter
(5)在Fragment中需要在Activity加载完成的方法onActivityCreated(Bundle savedInstanceState)中 获取数据并更新UI
2、具体的步骤如下:
(1) 当前Activity继承 FragmentActivity
(2)在布局中写ViewPager和PagerTabStrip,并设置相关的属性
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.PagerTabStrip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/pagerTabStrip"
android:gravity="top">
</android.support.v4.view.PagerTabStrip>
</android.support.v4.view.ViewPager>
(3)初始化控件
private ViewPager viewPager_vp;
private PagerTabStrip pagerTab;
。。。。
。。。。
viewPager_vp = (ViewPager) findViewById(R.id.viewPager_vp);
pagerTab = (PagerTabStrip) findViewById(R.id.pagertab);
(4)创建Fragment,继承V4包下的fragment
xml文件fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="TextView"
android:textColor="@android:color/holo_red_light"
android:textSize="24sp" />
</RelativeLayout>
import android.support.v4.app.Fragment;
public class ContentFragment extends Fragment {
private TextView show_tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, null);
show_tv = (TextView) view.findViewById(R.id.show_tv);
return view;
}
//*****************主要代码********************
//接收数据
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String title = (String) getArguments().get("key");
show_tv.setText(title);
}
//********************************************
(5)初始化数据,并在初始化数据时使用将数据出入fragment
private String[] titles = { "英语", "数学", "语文", "理综" };
private List<Fragment> list = new ArrayList<Fragment>();
// 》》》》》
//【初始化数据,并传递值给Fragment】
for (int i = 0; i < titles.length; i++) {
ContentFragment fragment = new ContentFragment();
Bundle bundle = new Bundle();
bundle.putString("key", titles[i]);
fragment.setArguments(bundle);
list.add(fragment);
}
(6)定义适配器,嵌套Fragment 需要继承 FragmentPagerAdapter必须重写的方法
/**
*
* 带有 FragmentManager的构造
* @param fm
* @param list
* @param titles
*/
public MyPagerAdapter(FragmentManager fm, List<Fragment> list,
String[] titles) {
super(fm);
this.list = list;
this.titles = titles;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
/**
* 有 PagerTabStrip返回title
*/
(7)设置适配器,getSupportFragmentmanager 方法 获取fragmengManager对象
viewPager_vp.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),list, titles));
完整代码如下:
activity_main.xml
<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_vp"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/pagertab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top" >
</android.support.v4.view.PagerTabStrip>
</android.support.v4.view.ViewPager>
</RelativeLayout>
fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/show_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="TextView"
android:textColor="@android:color/holo_red_light"
android:textSize="24sp" />
</RelativeLayout>
MainActivity.java
package com.phone.day_viewpagerfragment;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.view.Menu;
/**
* ViewPager 嵌套 Fragment
* V4包中
* 获取 FragmentManager 方法的方式为
* 1. 当前Activity继承 FragmentActivity
* 2. getSupportFragmentmanager 方法 获取对象
*
* 适配器 使用的是 FragmentPagerAdapter
* 必须重写的方法
* 1.带有 FragmentManager 的构造
* 2.getCount
* 3.getItem (--- 返回Fragment 对象)
*
*/
public class MainActivity extends FragmentActivity {
private ViewPager viewPager_vp;
private PagerTabStrip pagerTab;
private String[] titles = { "英语", "数学", "语文", "理综" };
private List<Fragment> list = new ArrayList<Fragment>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager_vp = (ViewPager) findViewById(R.id.viewPager_vp);
pagerTab = (PagerTabStrip) findViewById(R.id.pagertab);
// 初始化数据 --- 并传递值给Fragment
for (int i = 0; i < titles.length; i++) {
ContentFragment fragment = new ContentFragment();
Bundle bundle = new Bundle();
bundle.putString("key", titles[i]);
fragment.setArguments(bundle);
list.add(fragment);
}
// 设置适配器
viewPager_vp.setAdapter(new MyPagerAdapter(getSupportFragmentManager(),
list, titles));
}
}
ContentFragment.java
package com.phone.day_viewpagerfragment;
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;
public class ContentFragment extends Fragment {
private TextView show_tv;
//加载布局
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, null);
show_tv = (TextView) view.findViewById(R.id.show_tv);
return view;
}
//获取数据
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String title = (String) getArguments().get("key");
show_tv.setText(title);
}
}
自定义的适配器MyPagerAdapter继承FragmentPagerAdapter
package com.phone.day_viewpagerfragment;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* 嵌套Fragment 需要继承 FragmentPagerAdapter
*
*/
public class MyPagerAdapter extends FragmentPagerAdapter {
List<Fragment> list;
String[] titles;
/**
*
* 带有 FragmentManager的构造
* @param fm
* @param list
* @param titles
*/
public MyPagerAdapter(FragmentManager fm, List<Fragment> list,
String[] titles) {
super(fm);
this.list = list;
this.titles = titles;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
/**
* 有 PagerTabStrip返回title
*/
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}