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();
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
;