- 背景介绍:如我所知:在
Fragment
中是没有对返回键的回调的。而Activity
中是有这样的回调的。如onBackPressed();
,onKeyDown();
- 实际需求:但是在实际项目中,可能就会有这样的需求:当页面处于长按状态,点击返回键就取消长按;当页面不是长按状态,点击返回键,就退出当前的宿主
Activity
。(类似需求可以参考小米手机自带的图库App。[当然,小米的图库不一定是使用ViewPager+Fragment来实现的]); - 解决方式:就不说那么多了,直接给出我的解决方式吧,代码量很少,理解起来也很简单。
-
- 先看一段给
viewPager
添加Fragment
的代码:
- 先看一段给
private void InitViewPager() {
{
// add
Fragment fragmentA = new AFragment();
Fragment fragmentB = new BFragment();
Fragment fragmentC = new CFragment();
fragmentList = new ArrayList<Fragment>();
fragmentList.add(fragmentA);
fragmentList.add(fragmentB);
fragmentList.add(fragmentC);
}
viewPager = (ViewPager) findViewById(R.id.vPager);
viewPager.setAdapter(new ViewPagerAdapter(this
.getSupportFragmentManager(), fragmentList));
viewPager.setCurrentItem(0);
}
Activity`的返回键里面的逻辑
* 2. 在
@Override
public void onBackPressed() {
int currentItem = viewPager.getCurrentItem();
FragmentBackPressed fragment = (FragmentBackPressed) fragmentList
.get(currentItem);
fragment.onBackPressed();
}
-
- 大家可能在想
FragmentBackPressed
这个到底是什么鬼?
- 大家可能在想
- ==这个就是一个定义的接口:里面的逻辑如下:
public interface FragmentBackPressed {
/**
* 碎片的返回事件
*/
void onBackPressed();
}
然后让viewPager
里面的所有的Fragment
都实现该接口,然后,在该接口里面处理逻辑即可。以下是基于我的实际需求的一个简化,逻辑如下:
* * * 1. 在实现类AFragment
,BFragment
,CFragment
中:
@Override
public void onBackPressed() {
if (longClicked) {
// 取消按钮的逻辑处理
cancelLongClick();
return;
} else {
getActivity().finish();
}
}
代码很简单,简单解释一下:
* 首先这里一个boolean
的标记longClicked
是在长按点击的时候赋值为true
,然后在cancelLongClick();
里面赋值为false
。cancelLongClick();
里面就可以处理取消长按的逻辑。
- 基于以上几步就可以完成对
Fragment
的返回键按下的事件进行处理。
* 总结:
1.定义一个接口FragmentBackPressed
,里面有一个抽象方法void onBackPressed();
;
2. 让所有希望返回键被处理的Fragment
都去实现接口FragmentBackPressed
,并重写void onBackPressed();
3. 每个Fragment
去处理自己的返回逻辑。比如:当Fragmnet
被长按时,就取消长按,不finish
宿主Activity
,否则,就finish
宿主Activity
;