今天跟着视频的脚步,在学习完了简单的ViewPager之后,又紧接着学习了Viewpager+Fragment,即Fragment的复杂的页面显示,之所以称之为复杂的页面显示,主要是:1.允许放置Fragment,当Fragment存在,功能可以实现非常复杂,完善的功能,现代的客户端都会包含ViewPager+Fragment,由此可见非常重要。
那么如何去实现呢?其实和简单的ViewPager很相似,只不过不再是借助于PagerAdapter这个类去实现了,而是借助于FragmentPagerAdapter以及FragmentStatePagerAdapter两个适配器来进行ViewPager包含Fragment操作,这里主要是讲解使用FragmentPagerAdapter这个适配器来实现。
我们为了学习的方便,以模拟实现内涵段子的界面为背景进行学习的,主要是实现了页面的切换以及后期实现了RadioButton与ViewPager的交互,即点击哪一个相应的RadioButton,ViewPager将会跳转至哪一个界面,注意,我们只是实现了单方面的联动,只是RadioButton可以控制ViewPager,而ViewPager操控RadioButton笔者还没有实现。由于代码已经比较详细,这里直接上代码。
由于建立的文件比较多,先把类文件给大家看一下:
NeihanActivity.java的代码:
public class NeihanActivity extends FragmentActivity implements RadioGroup.OnCheckedChangeListener {
private ViewPager pager;
//需要实现的Fragment
private List<Fragment> fragments;
//用于切换ViewPager
private RadioGroup pagerSelector;
public NeihanActivity()
{
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_neihan);
pager=(ViewPager)findViewById(R.id.neihan_viewpager);
//!使用FragmentPagerAdapter来设置ViewPager的内容
//让每一个页面可以是Fragment
fragments=new ArrayList<>();
fragments.add(new ChapterFragment());
fragments.add(new ImageFragment());
fragments.add(new SettingsFragment());
NeihanFragmentPagerAdapter adapter=
new NeihanFragmentPagerAdapter(getSupportFragmentManager()
,fragments);
pager.setAdapter(adapter);
//RadioGroup
pagerSelector=(RadioGroup) findViewById(R.id.pager_selector);
pagerSelector.setOnCheckedChangeListener(this);
}
/**
*
* @param group
* @param checkedId
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//获取当前容器内部有多少个子控件
int count=group.getChildCount();
int checkedPos=0;
//遍历RadioGroup中的每一个RadioButton,看看第一个选中了
//因为ViewPager 设置显示页面,需要指定的是索引
for (int i=0;i<count;i++)
{
View v=group.getChildAt(i);
if(v instanceof RadioButton)
{
RadioButton rb=(RadioButton) v;
boolean checked=rb.isChecked();
if(checked)
{
checkedPos=i;
//因为每次只能显示一页,所以只有一个按钮处于选中状态
//直接跳出循环就可以
break;
}
}
}
//设置ViewPager显示第几页,有过渡效果
//pager.setCurrentItem(checkedPos);
//第二个参数的意思是是否有平滑滚动
pager.setCurrentItem(checkedPos,false);
}
}
NeihanFragmentPagerAdapter的代码:
public class NeihanFragmentPagerAdapter extends FragmentPagerAdapter {
//默认构造函数一定要有
//两步实现:Ctrl i Ctrl O
private List<Fragment> fragments;
/**
* 默认构造方法,当中的FragmentManager 一定是上一级组件的Manager
* 例如Activity包含的ViewPager 指定Adapter时候,
* 通过getSupportFragment,
*例如在Fragment内部使用的ViewPager,那么 ViewPager Adapter
* 应该是getChildFragmentManager()
* @param fm
*/
public NeihanFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragments) {
super(fm);
this.fragments=fragments;
}
/**
* 获取第几页的Fragment
* @param position
* @return
*/
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
/**
* 获取页面的个数
* @return
*/
@Override
public int getCount() {
return fragments.size();
}
}
ChapterFragment的代码:
public class ChapterFragment extends Fragment {
public ChapterFragment()
{
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_chapter,container,false);
return view;
}
}
ImageFragment的代码:
public class ImageFragment extends Fragment {
public ImageFragment()
{
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_image,container,false);
return view;
}
}
SettingsFragment的代码:
public class SettingsFragment extends Fragment {
public SettingsFragment()
{
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_settings,container,false);
return view;
}
}
activity.xml代码:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#f00"
android:textSize="30sp"
android:text="内涵"/>
<android.support.v4.view.ViewPager
android:id="@+id/neihan_viewpager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
>
</android.support.v4.view.ViewPager>
<RadioGroup
android:id="@+id/pager_selector"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="段子"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="图片"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置"/>
</RadioGroup>
三个Fragment中就只是一个TextView的控件,这里就不再显示出来,自己添加就可以,当然这里只是为了测试,所以才将Fragement写的这么简单,自己可以根据需求添加一些复杂的功能。
好了,今天就学习了这么多,明天将会学习ViewPager的生命周期,如果时间充足将会进行服务的学习,明天又是新的一天,加油!!!