实现滑动切换碎片
1.在App里面滑动切换页面也算是挺常见的,比如像微信一样通过滑动来从微信页面切换到通讯录或发现,我这些页面
2.那么首先将需要切换的界面弄好,就先建立4个页面 , 每一个页面的布局管理器都添加上一个id
3.现在新建这4个页面的java类 ,让这4个类都继承Fragment ,重写onCreateView并将这个类中需要的页面放入到inflater中 , 其余3个也一样
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_fragment_record , container , false);
return view;
}
4.那么就在MainActivity中将这4个Fragment加载出来,MainActivity的界面如下 ,这个是用RadioGroup包裹着4个RadioButton来组成的,每一个RadioButton都放入一个id
5.开始在MainActivity中获取到所有需要的id
6.定义一个Fragment数组 ,因为是4个要页面所以就new 4个null
//定义一个Fragment数组
Fragment[] fragments = new Fragment[]{null , null , null ,null};
7.想要显示碎片那么就先获取到Fragment管理器,通过管理器开启 Fragment事务,将Fragment对象添加到Fragment事务中,最后显示Fragment开启事务 ,这里呢申明private int index来获取到前是哪个页面
private void switchFragment(int fragmentIndex){
//获取到Fragment管理器
FragmentManager fragmentManager=MainActivity.this.getSupportFragmentManager();
//通过管理器开启Fragment事务
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();
//懒加载 如果需要显示的Fragment为null 就new,并添加到Fragment事务中
if(fragments[fragmentIndex] == null){
switch (fragmentIndex){
case 0 :
fragments[fragmentIndex] = new learnActivity();
index = 0;
break;
case 1 :
fragments[fragmentIndex] = new recordActivity();
index = 1;
break;
case 2 :
fragments[fragmentIndex] = new vocabularyActivity();
index = 2;
break;
case 3 :
fragments[fragmentIndex] = new userActivity();
index = 3;
break;
default:
}
//添加Fragment对象到Fragment事务中
fragmentTransaction.add(R.id.ll_main_content , fragments[fragmentIndex]);
}
//隐藏其他的fragment
for (int i = 0 ; i<fragments.length ; i++){
if(fragmentIndex != i && fragments[i] != null){
//隐藏
fragmentTransaction.hide(fragments[i]);
}
}
//显示fragment
fragmentTransaction.show(fragments[fragmentIndex]);
//开启事务
fragmentTransaction.commit();
}
8.现在开始实现滑动切换碎片,代码如下,这里呢默认为第一个碎片,通过监听MianActivity界面的屏幕触摸,来获取到用户手指按下的坐标和手指抬起的坐标,在手指抬起的时候,开始判断是从左边往右边滑动还是从右边往左边滑动,在每一次滑动的时候进行判断index为哪个数值在将index放入到switchFragment()方法中,这样就能实现滑动切换页面
private float touchDownX; //手指按下的X坐标
private float touchUpX; //手指抬起的X坐标
switchFragment(0);
rbLearn.setChecked(true);
//触摸监听器
llContent.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//Toast.makeText(mMainActivity, "123", Toast.LENGTH_SHORT).show();
//判断动作是否等于按下
if(event.getAction() == MotionEvent.ACTION_DOWN){
touchDownX = event.getX();
return true;
}else if(event.getAction() == MotionEvent.ACTION_UP){
touchUpX = event.getX();
//判断滑动的方向是从左往右
Log.d("index" , ""+index+"");
if(touchUpX - touchDownX > 100){
//判断index是否为0
if(index == 0){
}else{
index = index - 1;
if(index == 2){
rbVocabulary.setChecked(true);
}else if(index == 1){
rbRecord.setChecked(true);
}else if(index == 0){
rbLearn.setChecked(true);
}
switchFragment(index);
}
}//判断滑动的方向是从右往左
else if(touchDownX - touchUpX > 100){
//判断index是否为3
if(index == 3){
}else{
index = index+1;
if(index == 1){
//记录按钮获取焦点
rbRecord.setChecked(true);
}else if(index == 2){
rbVocabulary.setChecked(true);
}else if(index == 3){
rbUser.setChecked(true);
}
switchFragment(index);
}
}
return true;
}
return false;
}
});
9.效果图,在学习界面从右往左滑动切换到记录页面将并获取焦点