Android结合fragment灵活使用ViewPager
一个Activity由N个控件和一个fragment组成,该fragment由一个ViewPager实例组成,而该ViewPager由N个fragment组成。故为UI添加ViewPager后,用户可滑动屏幕,切换查看不同的列表项界面。
最后效果图,共4个列表项界面,可滑动切换,也可点击切换。滑动切换时顶上一排和底下一排的控件不参与滑动切换,中间部分参与滑动滑动。
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早