您的位置:首页 > 其它

ViewPager,Fragment制作带底部导航栏的滑动界面

2019-04-09 20:45 246 查看
版权声明:版权归本原作者木水先生所有,欢迎转载 https://blog.csdn.net/weixin_39963192/article/details/89075857

读起来稍有难度,需要一点耐心来看。

首先先看一下,mainActivity布局。我已经对布局文件进行简化,在这里仅仅给大家留出来控件的类型,内部结构,读者可自行设计。

[code]<RelativeLayout>
<RadioGroup>
<RadioButton/>
<RadioButton/>
<RadioButton/>
<RadioButton/>
</RadioGroup>
<android.support.v4.view.ViewPager/>
</RelativeLayout>

创建一个MainActivity,其中声明四个PAGE的常量指代对应的Fragment。

在RadioGroup放入四个RadioButton(单选按钮,RadioGroup中的RadioButton每次只能有一个被选中)。

为RadioButton添加点击事件,并为adapter(后边会详细讲到)设置当前界面

onPageScrollStateChanged中的state参数有三种状态:

  • 0:什么都没做
  • 1:开始滑动
  • 2:滑动结束

 

[code]public class MainActivity extends BaseActivity implements RadioGroup.OnCheckedChangeListener, ViewPager.OnPageChangeListener {
public static final int PAGE_ONE = 0;
public static final int PAGE_TWO = 1;
public static final int PAGE_THREE = 2;
public static final int PAGE_FOUR = 3;
private RadioGroup rg_tab_bar;
private RadioButton rb_deal;
private RadioButton rb_job;
private RadioButton rb_chater;
private RadioButton rb_mine;
private ViewPager vPager;
private MainFragPagerAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new MainFragPagerAdapter(getSupportFragmentManager());
bindViews();
rb_deal.setChecked(true);
}

private void bindViews(){
rg_tab_bar = (RadioGroup) findViewById(R.id.rg_tab_bar);
rb_deal = (RadioButton)findViewById(R.id.rb_deal);
rb_job = (RadioButton)findViewById(R.id.rb_job);
rb_chater = (RadioButton)findViewById(R.id.rb_chater);
rb_mine = (RadioButton)findViewById(R.id.rb_mine);
rg_tab_bar.setOnCheckedChangeListener(this);
vPager = (ViewPager)findViewById(R.id.vpager);
vPager.setAdapter(mAdapter);
vPager.setCurrentItem(0);
vPager.addOnPageChangeListener(this);
}

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb_deal:
vPager.setCurrentItem(PAGE_ONE);
break;
case R.id.rb_job:
vPager.setCurrentItem(PAGE_TWO);
break;
case R.id.rb_chater:
vPager.setCurrentItem(PAGE_THREE);
break;
case R.id.rb_mine:
vPager.setCurrentItem(PAGE_FOUR);
break;
}

}

@Override
public void onPageScrollStateChanged(int state) {
if(state == 2){
switch (vPager.getCurrentItem()){
case PAGE_ONE:
rb_deal.setChecked(true);
break;
case PAGE_TWO:
rb_job.setChecked(true);
break;
case  PAGE_THREE:
rb_chater.setChecked(true);
break;
case PAGE_FOUR:
rb_mine.setChecked(true);
break;
}
}
}
}

下边来看adapter,我们在这里继承FragmentPagerAdapter,其中定义了四个Fragment,和一个用来存储fragment数量的全局静态常量PAGE_COUNT。重写getItem函数,这个item创建vpager时会自动调用,判断当前遍历的位置,返回对应的Fragment的对象,重写getCount()函数,返回ViewPager中的碎片数量。

对比FragmentPagerAdapter和FragmentStatePagerAdapter:

  • 两者都继承PagerAdapter
  • FragmentPagerAdapter保存加入的所有fragment对象,即每次重新进入该界面(界面距离相差2),重新执行creatview方法,但是不执行类的构造方法。适用于界面数量比较小。
  • FragmentStatePagerAdapter,当重新进入该界面(界面距离相差2),需要重新执行类的构造方法。适用于有大量界面。
[code]public class MainFragPagerAdapter extends FragmentPagerAdapter {
public final int PAGE_COUNT = 4;
private Fragment_1 myFragment1 = null;
private Fragment_2 myFragment2 = null;
private Fragment_3 myFragment3 = null;
private Fragment_4 myFragment4 = null;

public MainFragPagerAdapter(FragmentManager fm) {
super(fm);
myFragment1 = new Fragment_1();
myFragment2 = new Fragment_2();
myFragment3 = new Fragment_3();
myFragment4 = new Fragment_4();
}

@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position){
case MainActivity.PAGE_ONE:
fragment = myFragment1;
break;
case MainActivity.PAGE_TWO:
fragment = myFragment2;
break;
case MainActivity.PAGE_THREE:
fragment = myFragment3;
break;
case MainActivity.PAGE_FOUR:
fragment = myFragment4;
break;
}
return fragment;
}

@Override
public int getCount() {
return PAGE_COUNT;
}

创建四个Fragment,自行加入布局。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: