Android ViewPager+Fragment 模式中 Fragment的返回键的处理

  • 背景介绍:如我所知:在Fragment中是没有对返回键的回调的。而Activity中是有这样的回调的。如onBackPressed(); ,onKeyDown();
  • 实际需求:但是在实际项目中,可能就会有这样的需求:当页面处于长按状态,点击返回键就取消长按;当页面不是长按状态,点击返回键,就退出当前的宿主Activity。(类似需求可以参考小米手机自带的图库App。[当然,小米的图库不一定是使用ViewPager+Fragment来实现的]);
  • 解决方式:就不说那么多了,直接给出我的解决方式吧,代码量很少,理解起来也很简单。
    1. 先看一段给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);
    }


* 2. 在
Activity`的返回键里面的逻辑

@Override
    public void onBackPressed() {
        int currentItem = viewPager.getCurrentItem();
        FragmentBackPressed fragment = (FragmentBackPressed) fragmentList
                .get(currentItem);
        fragment.onBackPressed();
    }
    1. 大家可能在想FragmentBackPressed这个到底是什么鬼?
  • ==这个就是一个定义的接口:里面的逻辑如下:
public interface FragmentBackPressed {

    /**
     * 碎片的返回事件
     */
    void onBackPressed();
}

然后让viewPager 里面的所有的Fragment 都实现该接口,然后,在该接口里面处理逻辑即可。以下是基于我的实际需求的一个简化,逻辑如下:
* * * 1. 在实现类AFragmentBFragmentCFragment中:

@Override
    public void onBackPressed() {
        if (longClicked) {
            // 取消按钮的逻辑处理
            cancelLongClick();
            return;
        } else {
            getActivity().finish();
        }

    }

代码很简单,简单解释一下:
* 首先这里一个boolean的标记longClicked是在长按点击的时候赋值为true,然后在cancelLongClick();里面赋值为falsecancelLongClick();里面就可以处理取消长按的逻辑。

  • 基于以上几步就可以完成对Fragment的返回键按下的事件进行处理。

* 总结: 
1.定义一个接口FragmentBackPressed,里面有一个抽象方法void onBackPressed();
2. 让所有希望返回键被处理的Fragment都去实现接口FragmentBackPressed,并重写void onBackPressed();
3. 每个Fragment 去处理自己的返回逻辑。比如:当Fragmnet被长按时,就取消长按,不finish宿主Activity,否则,就finish宿主Activity

你可能感兴趣的:(实际需求解决方案)