当前位置: 首页 > 工具软件 > ViewPager > 使用案例 >

ViewPager的用法(3)——ViewPager嵌套Fragment

宣原
2023-12-01

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必须重写的方法
                     *  1.带有 FragmentManager  的构造
                     *  2.getCount
                     *  3.getItem  (--- 返回Fragment 对象)


/**
	 * 
	 *    带有 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];
	}

}

完成!!!





 类似资料: