Android结合fragment灵活使用ViewPager


一个Activity由N个控件和一个fragment组成,该fragment由一个ViewPager实例组成,而该ViewPager由N个fragment组成。故为UI添加ViewPager后,用户可滑动屏幕,切换查看不同的列表项界面。

 

最后效果图,共4个列表项界面,可滑动切换,也可点击切换。滑动切换时顶上一排和底下一排的控件不参与滑动切换,中间部分参与滑动滑动。

Android结合fragment灵活使用ViewPager_android

Android结合fragment灵活使用ViewPager_ViewPager_02

Android结合fragment灵活使用ViewPager_android_03

Android结合fragment灵活使用ViewPager_布局文件_04

1、 创建主框架的布局文件(activity_main.xml)

a)      包含顶上4个Button、底下2个Button以及中间的fragment


<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"> 

        <LinearLayout 
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:orientation="horizontal">
		    <Button
		        android:id="@+id/TextButton1"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:layout_weight="1" 
		        android:background="#00000000"
		        android:textColor="#ffA9A9A9"
		        android:text="时间" />
	
		    <Button
		        android:id="@+id/TextButton2"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:layout_weight="1" 
		        android:background="#00000000"
		        android:textColor="#ffA9A9A9"
		        android:text="监控" /> 
		       
		    <Button
		        android:id="@+id/TextButton3"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:layout_weight="1"
		       android:background="#00000000"
		       android:textColor="#ffA9A9A9"
		        android:text="闹钟" /> 
		        
		    <Button
		        android:id="@+id/TextButton4"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:layout_weight="1"
		        android:background="#00000000"
		        android:textColor="#ffA9A9A9"
		        android:text="微调" /> 
		        
	    </LinearLayout>
	    
        <FrameLayout
		    android:id="@+id/fragmentContainer"
			android:layout_width="fill_parent"
		    android:layout_height="match_parent" 
		    android:layout_weight="1"
		    />
        
	    <LinearLayout 
	        android:layout_width="match_parent"
	        android:layout_height="wrap_content"
	        android:orientation="horizontal">
		    <Button
		        android:id="@+id/ConnectButton"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:layout_weight="1"
		        android:text="连接" />
	
		    <Button
		        android:id="@+id/QuitButton"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		         android:layout_weight="1"
		        android:text="退出" /> 
	    </LinearLayout>
	    
	    
	    
	    </LinearLayout>

</RelativeLayout>




2、 创建第一个列表项的布局文件(fragment_timer.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <TimePicker
        android:id="@+id/Timer_Picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1" />

   <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"   
        > 
		
		<Button 
			android:text="更新" 
			android:id="@+id/Timer_UpdateButton" 
			android:layout_width="match_parent" 
			android:layout_height="wrap_content"
			android:layout_weight="1" >
		</Button>
    </LinearLayout>
   
</LinearLayout>




3、 创建第二个列表项的布局文件(fragment_time_monitor.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"   
        android:layout_gravity="center"
        android:layout_weight="1"
     > 
     
	    <TimePicker
	        android:id="@+id/TimeMonitor_Picker1"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_gravity="center"
	        android:layout_weight="1" />
	    
	    <TimePicker
	        android:id="@+id/TimeMonitor_Picker2"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_gravity="center"
	        android:layout_weight="1" />
	    
    </LinearLayout>
    
   <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"   
        > 
		
		<Button  
			android:id="@+id/TimeMonitor_UpdateButton" 
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:text="更新"  >
		</Button>

		<Switch
		    android:id="@+id/TimeMonitor_Switch"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:layout_weight="1" >
		</Switch>

    </LinearLayout> 
    
    
    
</LinearLayout>




4、 创建第三个列表项的布局文件(fragment_clock.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <TimePicker
        android:id="@+id/Clock_Picker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1" />

   <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"   
        > 
		
		<Button  
			android:id="@+id/Clock_UpdateButton" 
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content"
			android:layout_weight="1"
			android:text="更新"  >
		</Button>

		<Switch
		    android:id="@+id/Clock_Switch"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"
		    android:layout_weight="1" >
		</Switch>

    </LinearLayout> 
    
     
</LinearLayout>




5、 创建第四个列表项的布局文件(fragment_adjustment.xml)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <ScrollView
        android:id="@+id/Adjustment_ScrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>
 

   <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"   
        > 
		
		<Button 
			android:text="更新" 
			android:id="@+id/Adjustment_UpdateButton" 
			android:layout_width="match_parent" 
			android:layout_height="wrap_content"
			android:layout_weight="1" >
		</Button>
    </LinearLayout> 
    
    
</LinearLayout>



6、 创建Activity(ViewPagerActivity.java)

a)     ViewPagerActivity继承FragmentActivity类,由getSupportFragmentManager()获得FragmentManager对象。或者不考虑版本兼容问题,也可以直接继承Activity并由getFragmentManager()获得FragmentManager对象。

b)    FragmentManager类负责管理fragment并将它们的视图添加到Activity的视图层级结构中。具体管理fragment队列和fragment事务的回退栈。具体操作如下:Fragment使用容器视图资源ID向FragmentManager获取fragment实例。如果获取的fragment在队列中存在,FragmentManager随即会将之返还。如果不存在,则Fragment获取不到fragment实例,fragment为null。那么由FragmentManager通过调用beginTransaction方法开启一个事务。使用add(…)方法实现向队列内加入fragment,add(…)方法需要传入容器视图资源ID和fragment的实例。最后调用commit()方法提交事务。

package com.example.viewpagerdemo3.Activity;
 
import com.example.viewpagerdemo3.R; 
import com.example.viewpagerdemo3.Fragment.AdjustmentFragment;
import com.example.viewpagerdemo3.Fragment.ClockFragment;
import com.example.viewpagerdemo3.Fragment.TimeMonitorFragment;
import com.example.viewpagerdemo3.Fragment.TimerFragment; 
import com.example.viewpagerdemo3.Fragment.ViewPagerFragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.Button;

public class ViewPagerActivity extends FragmentActivity { 
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.activity_main);   
		 
		
		FragmentManager fm = getSupportFragmentManager();  
        android.support.v4.app.Fragment fragment= fm.findFragmentById(R.id.fragmentContainer);  
          
        if (fragment==null) {  
            fragment = new ViewPagerFragment();  
            fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit();  
        } 
        
		
	}

	
}




7、 创建ViewPager的Fragment类(ViewPagerFragment.java)

a)      首先在onCreateView(…)中实例化Button

b)     传入getActivity()参数,实例化ViewPager

c)      创建资源ID(res/values/ids,xml),并对ViewPager实例进行配置。因为ViewPager是一种构建块,需要资源ID,FragmentManager要求任何用作fragment容器的视图都必须具有资源ID。ViewPager是一个fragment容器,因此必须赋予其资源ID。

d)     获取Activity的FragmentManager实例,然后将FragmentManager实例传入FragmentStatePagerAdapter的构造方法获得FragmentStatePagerAdapter的实例,最后设置ViewPager的适配器为FragmentStatePagerAdapter。因为ViewPager需要借助PagerAdapter的支持才能提供视图,不过由于ViewPager与PagerAdapter之间配合使用相对复杂,所以我们使用PagerAdapter的子类FragmentStatePagerAdapter来处理ViewPager提供视图时的一些细节问题。FragmentStatePagerAdapter有两个方法来处理问题:getCount()和gerItem(intpos)。getCount()返回ViewPager包含的列表项数目,gerItem(int pos)返回当前列表项ID的视图Fragment。

e)     调用ViewPager.setCurrentItem(0)函数设置当前要显示的列表项为列表项0,并点亮第0个Button

f)      调用ViewPager.setOnPageChangeListener()函数,设置ViewPager的监听器。有三个方法: onPageSelected(int pos) 、onPageScrolled(int arg0, float arg1, int arg2)、onPageScrollStateChanged(int arg0)。分别告知我们当前哪个页面被选中、当前页面会滑向哪里、当前页面的行为状态,如正在被用户滑动、页面滑入到位到完全静止以及页面切换完成后的闲置状态。

g)     设置4个Button控件的点击监听器。点击某个Button时,就将ViewPager滑到某个列表,并点亮该Button。

h)     自定义创建点亮某个Button的函数。

i)       最后补充说明:FragmentPagerAdapter是另外一种可用的PagerAdapter,其使用方法与FragmentStatePagerAdapter基本相同。唯一区别在于二者在卸载不再需要的fragemnt时,所采用的方法不同。FragmentStatePagerAdapter对于不需要的fragment,可将fragment从activity的FragmentManager中彻底移除。FragmentStatePagerAdapter类名中的"State"表明:在销毁fragment时,它会将其onSaveInstanceState(Bundle)方法中的Bundle信息保存下来。用户切换回原来的页面后,保存的实例状态可用于恢复生成新的fragment。FragmentPagerAdapter对于不需要的fragment会选择调用事务的detach(Fragment)方法,而非remove(Fragment)。FragmentStatePagerAdapter更省内存,FragmentPagerAdapter更易于管理更安全。



<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    
	<item type="id" name="viewPager"></item>    
	
</resources>





package com.example.viewpagerdemo3.Fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

import com.example.viewpagerdemo3.R;

public class ViewPagerFragment extends Fragment {


	public Button []TextButton=new Button[4];
	
	private ViewPager mViewPager;  
    
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
          
    }  
  
    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
          
    	//实例化TextButton
    	TextButton[0] = (Button) getActivity().findViewById(R.id.TextButton1); 
		TextButton[1] = (Button) getActivity().findViewById(R.id.TextButton2);
		TextButton[2] = (Button) getActivity().findViewById(R.id.TextButton3); 
		TextButton[3] = (Button) getActivity().findViewById(R.id.TextButton4); 
		
    	//创建ViewPager实例
    	mViewPager=new ViewPager(getActivity());
    			
    	//创建资源ID(res/values/ids.xml),并配置mViewPager
    	mViewPager.setId(R.id.viewPager);  
    			
    	//获取Activity的FragmentManager实例
    	FragmentManager fm = getActivity().getSupportFragmentManager();
    			
    	//设置adapter为FagmentStatePagerAdapter的一个匿名实例
    	//FragmentStatePagerAdapter负责管理与ViewPager的对话并协同工作。
    	mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) { 
    				
    				
    			//getCount()返回mViewPager包含的列表项数目
    			@Override
    			public int getCount() {
    				// TODO Auto-generated method stub
    				//return mCrimes.size();
    				return 4;
    			}
    			
    			//根据列表项ID,返回一个有效配置的Fragment
    			@Override
    			public Fragment getItem(int pos) {
    				// TODO Auto-generated method stub 
    				switch (pos) {
    				
    				case 0: 
    					return TimerFragment.newInstance(); 
    				case 1:
    					return TimeMonitorFragment.newInstance(); 
    				case 2:
    					return ClockFragment.newInstance(); 
    				case 3:
    					return AdjustmentFragment.newInstance(); 
    				default:
    					return TimerFragment.newInstance();
    					
    				}
    				
    			}
    		});  
    		 
    		 
    		//设置当前要显示的列表项 
    		mViewPager.setCurrentItem(0);
    		LightUpSingleButton(0);
    		
    		//设置监听器,监听ViewPager当前显示页面的状态变化
    		mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
    			
    			//onPageSelected()方法告知我们当前哪个页面会被选中
    			@Override
    			public void onPageSelected(int pos) {
    				// TODO Auto-generated method stub 
    				
    				LightUpSingleButton(pos);
    			}
    			
    			//onPageScrolled()方法告知我们页面将会滑向哪里
    			@Override
    			public void onPageScrolled(int arg0, float arg1, int arg2) {
    				// TODO Auto-generated method stub
    				
    			}
    			
    			//onPageScrollStateChanged()方法告知我们当前页面所处的行为状态,如正在被用户滑动,页面滑动入位到完全静止以及页面切换完成后的闲置状态
    			@Override
    			public void onPageScrollStateChanged(int arg0) {
    				// TODO Auto-generated method stub 
    			}
    			
    		});
    		 
        
    	//设置ViewPager为activity的内容视图  
        return mViewPager;   
    }

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onActivityCreated(savedInstanceState); 
		
		TextButton[0].setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mViewPager.setCurrentItem(0);
				LightUpSingleButton(0);
			}
		});
		
		TextButton[1].setOnClickListener(new OnClickListener() {
					
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mViewPager.setCurrentItem(1);
				LightUpSingleButton(1);
			}
		});
		
		TextButton[2].setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mViewPager.setCurrentItem(2);
				LightUpSingleButton(2);
			}
		});
		
		TextButton[3].setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mViewPager.setCurrentItem(3);
				LightUpSingleButton(3);
			}
		});
		
	}
	
	
	public void LightUpSingleButton(int num){
		
		for (int i = 0; i < TextButton.length; i++) {
			
			if (num==i) {
				TextButton[i].setTextColor(0xFFDB7093);
			}else {
				TextButton[i].setTextColor(0xFFA9A9A9);
			}
			
		}
		
	}
    
    
}


/***********************
 * 		FragmentPagerAdapter是另外一种可用的PagerAdapter,其使用方法与FragmentStatePagerAdapter基本相同。
 * 唯一区别在于二者在卸载不再需要的fragemnt时,所采用的方法不同。
 * 		FragmentStatePagerAdapter对于不需要的fragment,可将fragment从activity的FragmentManager中 彻底移除。
 * FragmentStatePagerAdapter类名中的"State"表明:在销毁fragment时,它会将其onSaveInstanceState(Bundle)方法中的Bundle信息保存下来。
 * 用户切换回原来的页面后,保存的实例状态可用于恢复生成新的fragment。
 * 		FragmentPagerAdapter对于不需要的fragment会选择调用事务的detach(Fragment)方法,而非remove(Fragment)。
 * 		FragmentStatePagerAdapter更省内存,FragmentPagerAdapter更易于管理更安全。
 */




8、 创建第一个列表项的Fragment(TimerFragment.java)


package com.example.viewpagerdemo3.Fragment;
 
import com.example.viewpagerdemo3.R;  
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; 
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button; 
import android.widget.TimePicker;

public class TimerFragment extends Fragment {
 
	   
	
	/*********************************
	 * 
	 * 1、onCreate(Bundle)是公共方法,因此可以被托管fragment的任何activity调用
	 * 2、类似activity,fragment同样具有保存及获取状态的bundle,可以根据需要覆盖Fragment.onSaveInstanceState(Bundle)
	 * 3、onCreate(Bundle)中,没有生成fragment视图。
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState); 
		
	}
	
	/*************************************
	 * 
	 * 通过该方法生成fragment视图的布局,然后将生成的View返回给托管activity。
	 * LayoutInflater及ViewGroup是用来生成布局的必要参数。
	 * Bundle包含了该方法的保存状态下重建视图所使用的数据。
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		
		// 调用LayoutInflater.inflate(...)方法并传入布局的资源ID生成的。第二个参数是视图的父视图,通过父视图来正确配置组件。
		// 第三个参数告知布局生成器是否将生成的视图添加给父视图。这里我们传入了false,因为我们将通过activity代码的方式添加视图。
		View v = inflater.inflate(R.layout.fragment_timer, parent, false);
				 
		  
		return v;
	}
	
	/**************************************
	 * 目的:附加argument bundle给Fragment,需要调用Fragment.setArguments(Bundle)方法。
	 * 要求:该任务必须在fragment创建后,添加给activity前完成
	 * 方法:使用newInstance()方法,完成Fragment实例及bundle对象的创建,然后将argument放入bundle中,最后附加给Fragment
	 * 其他:托管activity需要fragment实例时,需要调用newInstance()方法,而非直接调用其构造方法。而且,为满足fragment创建argument的要求,activity可传入
	 * 		任何需要的参数给newInstance()方法。
	 * 
	 * @param crimeID
	 * @return
	 */
	public static TimerFragment newInstance(){
		
		Bundle args = new Bundle(); 
		
		TimerFragment fragment=new TimerFragment();
		fragment.setArguments(args);
		
		return fragment; 
		
		
	}

}




9、 创建第二个列表项的Fragment(TimeMonitorFragment.java)


package com.example.viewpagerdemo3.Fragment;
 
import com.example.viewpagerdemo3.R; 
import android.os.Bundle;
import android.support.v4.app.Fragment;  
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button; 
import android.widget.Switch;
import android.widget.TimePicker;

public class TimeMonitorFragment extends Fragment { 
	
	/*********************************
	 * 
	 * 1、onCreate(Bundle)是公共方法,因此可以被托管fragment的任何activity调用
	 * 2、类似activity,fragment同样具有保存及获取状态的bundle,可以根据需要覆盖Fragment.onSaveInstanceState(Bundle)
	 * 3、onCreate(Bundle)中,没有生成fragment视图。
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		 
		
	}
	
	/*************************************
	 * 
	 * 通过该方法生成fragment视图的布局,然后将生成的View返回给托管activity。
	 * LayoutInflater及ViewGroup是用来生成布局的必要参数。
	 * Bundle包含了该方法的保存状态下重建视图所使用的数据。
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		
		// 调用LayoutInflater.inflate(...)方法并传入布局的资源ID生成的。第二个参数是视图的父视图,通过父视图来正确配置组件。
		// 第三个参数告知布局生成器是否将生成的视图添加给父视图。这里我们传入了false,因为我们将通过activity代码的方式添加视图。
		View v = inflater.inflate(R.layout.fragment_time_monitor, parent, false); 
		   
				
		return v;
	}
	
	/**************************************
	 * 目的:附加argument bundle给Fragment,需要调用Fragment.setArguments(Bundle)方法。
	 * 要求:该任务必须在fragment创建后,添加给activity前完成
	 * 方法:使用newInstance()方法,完成Fragment实例及bundle对象的创建,然后将argument放入bundle中,最后附加给Fragment
	 * 其他:托管activity需要fragment实例时,需要调用newInstance()方法,而非直接调用其构造方法。而且,为满足fragment创建argument的要求,activity可传入
	 * 		任何需要的参数给newInstance()方法。
	 * 
	 * @param crimeID
	 * @return
	 */
	public static TimeMonitorFragment newInstance(){
		
		Bundle args = new Bundle(); 
		
		TimeMonitorFragment fragment=new TimeMonitorFragment();
		
		fragment.setArguments(args);
		
		return fragment; 
		
		
	}

}





10、 创建第三个列表项的Fragment(ClockFragment.java)



package com.example.viewpagerdemo3.Fragment;
 
import com.example.viewpagerdemo3.R;  
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox; 

public class ClockFragment extends Fragment { 
	
	/*********************************
	 * 
	 * 1、onCreate(Bundle)是公共方法,因此可以被托管fragment的任何activity调用
	 * 2、类似activity,fragment同样具有保存及获取状态的bundle,可以根据需要覆盖Fragment.onSaveInstanceState(Bundle)
	 * 3、onCreate(Bundle)中,没有生成fragment视图。
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		 
		
	}
	
	/*************************************
	 * 
	 * 通过该方法生成fragment视图的布局,然后将生成的View返回给托管activity。
	 * LayoutInflater及ViewGroup是用来生成布局的必要参数。
	 * Bundle包含了该方法的保存状态下重建视图所使用的数据。
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		
		// 调用LayoutInflater.inflate(...)方法并传入布局的资源ID生成的。第二个参数是视图的父视图,通过父视图来正确配置组件。
		// 第三个参数告知布局生成器是否将生成的视图添加给父视图。这里我们传入了false,因为我们将通过activity代码的方式添加视图。
		View v = inflater.inflate(R.layout.fragment_clock, parent, false);
		  
		  
		return v;
	}
	
	/**************************************
	 * 目的:附加argument bundle给Fragment,需要调用Fragment.setArguments(Bundle)方法。
	 * 要求:该任务必须在fragment创建后,添加给activity前完成
	 * 方法:使用newInstance()方法,完成Fragment实例及bundle对象的创建,然后将argument放入bundle中,最后附加给Fragment
	 * 其他:托管activity需要fragment实例时,需要调用newInstance()方法,而非直接调用其构造方法。而且,为满足fragment创建argument的要求,activity可传入
	 * 		任何需要的参数给newInstance()方法。
	 * 
	 * @param crimeID
	 * @return
	 */
	public static ClockFragment newInstance(){
		
		Bundle args = new Bundle(); 
		
		ClockFragment fragment=new ClockFragment();
		fragment.setArguments(args);
		
		return fragment; 
		
		
	}

}




11、        创建第四个列表项的Fragment(AdjustmentFragment.java)

 

package com.example.viewpagerdemo3.Fragment;
 
import com.example.viewpagerdemo3.R;  
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; 
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button; 
import android.widget.ScrollView;

public class AdjustmentFragment extends Fragment { 
	
	
	/*********************************
	 * 
	 * 1、onCreate(Bundle)是公共方法,因此可以被托管fragment的任何activity调用
	 * 2、类似activity,fragment同样具有保存及获取状态的bundle,可以根据需要覆盖Fragment.onSaveInstanceState(Bundle)
	 * 3、onCreate(Bundle)中,没有生成fragment视图。
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		 
		
	}
	
	/*************************************
	 * 
	 * 通过该方法生成fragment视图的布局,然后将生成的View返回给托管activity。
	 * LayoutInflater及ViewGroup是用来生成布局的必要参数。
	 * Bundle包含了该方法的保存状态下重建视图所使用的数据。
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup parent,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		
		// 调用LayoutInflater.inflate(...)方法并传入布局的资源ID生成的。第二个参数是视图的父视图,通过父视图来正确配置组件。
		// 第三个参数告知布局生成器是否将生成的视图添加给父视图。这里我们传入了false,因为我们将通过activity代码的方式添加视图。
		View v = inflater.inflate(R.layout.fragment_adjustment, parent, false); 
		 
				
		return v;
	}
	
	/**************************************
	 * 目的:附加argument bundle给Fragment,需要调用Fragment.setArguments(Bundle)方法。
	 * 要求:该任务必须在fragment创建后,添加给activity前完成
	 * 方法:使用newInstance()方法,完成Fragment实例及bundle对象的创建,然后将argument放入bundle中,最后附加给Fragment
	 * 其他:托管activity需要fragment实例时,需要调用newInstance()方法,而非直接调用其构造方法。而且,为满足fragment创建argument的要求,activity可传入
	 * 		任何需要的参数给newInstance()方法。
	 * 
	 * @param crimeID
	 * @return
	 */
	public static AdjustmentFragment newInstance(){
		
		Bundle args = new Bundle(); 
		
		AdjustmentFragment fragment=new AdjustmentFragment();
		fragment.setArguments(args);
		
		return fragment; 
		
		
	}

}



 

 

 

 

  《Android编程权威指南》之学习心得与笔记                                     by 2015.2.2早