多层嵌套Fragment监听返回键

蔚落 2021-09-16 15:46 479阅读 0赞

在有一些情况下,需要进行Fragment的监听,简单的Fragment监听可能是如下这样子的。

  1. @Override
  2. public void onBackPressed() {
  3. if(selectedFragment.equals(fragmentA) && fragmentA.hasExpandedRow()) {
  4. fragmentA.collapseRow();
  5. } else if(selectedFragment.equals(fragmentA) && fragmentA.isShowingLoginView()) {
  6. fragmentA.hideLoginView();
  7. } else if(selectedFragment.equals(fragmentA)) {
  8. popBackStack();
  9. } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition1()) {
  10. fragmentB.reverseCondition1();
  11. } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition2()) {
  12. fragmentB.reverseCondition2();
  13. } else if(selectedFragment.equals(fragmentB)) {
  14. popBackStack();
  15. } else {
  16. // handle by activity
  17. super.onBackPressed();
  18. }
  19. }

具体说上以上的情况,就是获取Fragment的实例,然后再进行抛栈的做法,这里我们可以抽象出一个接口,然后Fragment再继承这些接口。适用于单个Fragment,多个Fragment嵌套的场景

接下来是4步操作

  1. 第一步:FragmentBackHandler

    /**

    • @Time : 2018/10/16
    • @Author : 蛇崽
    • @Email : 643435675@QQ.com
    • @Description :
      */
      public interface FragmentBackHandler {
      boolean onBackPressed();
      }
  2. 第二步:BackHandlerHelper

    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;

    import java.util.List;

    /**

    • @Time : 2018/10/16
    • @Author : 蛇崽
    • @Email : 643435675@QQ.com
    • @Description :
      /
      public class BackHandlerHelper {
      /*

      • 将back事件分发给 FragmentManager 中管理的子Fragment,如果该 FragmentManager 中的所有Fragment都
      • 没有处理back事件,则尝试 FragmentManager.popBackStack()
        *
      • @return 如果处理了back键则返回 true
      • @see #handleBackPress(Fragment)
      • @see #handleBackPress(FragmentActivity)
        */
        public static boolean handleBackPress(FragmentManager fragmentManager) {
        List fragments = fragmentManager.getFragments();

        if (fragments == null) return false;

        for (int i = fragments.size() - 1; i >= 0; i—) {

        1. Fragment child = fragments.get(i);
        2. if (isFragmentBackHandled(child)) {
        3. return true;
        4. }

        }

        if (fragmentManager.getBackStackEntryCount() > 0) {

        1. fragmentManager.popBackStack();
        2. return true;

        }
        return false;
        }

        public static boolean handleBackPress(Fragment fragment) {
        return handleBackPress(fragment.getChildFragmentManager());
        }

        public static boolean handleBackPress(FragmentActivity fragmentActivity) {
        return handleBackPress(fragmentActivity.getSupportFragmentManager());
        }

        /**

      • 判断Fragment是否处理了Back键
        *
      • @return 如果处理了back键则返回 true
        */
        public static boolean isFragmentBackHandled(Fragment fragment) {
        return fragment != null
        1. && fragment.isVisible()
        2. && fragment.getUserVisibleHint() //for ViewPager
        3. && fragment instanceof FragmentBackHandler
        4. && ((FragmentBackHandler) fragment).onBackPressed();
        }
        }
  3. 第三步:Fragment中实现接口,重写方法

    public class HomeFragment extends Fragment implements FragmentBackHandler{

    1. @Override
    2. public boolean onBackPressed() {
    3. return BackHandlerHelper.handleBackPress(this);
    4. }

    }

  4. 第四步:Activity中实现返回按钮的逻辑

    @Override

    1. public boolean onKeyDown(int keyCode, KeyEvent event) {
    2. //点击两次返回退出应用
    3. if (keyCode == KeyEvent.KEYCODE_BACK) {
    4. // 这里根据自己的需求进行返回按钮的事件操作
    5. if (Jzvd.backPress()) {
    6. return true;
    7. }
    8. if ((System.currentTimeMillis() - mExitTime) > 2000) {
    9. Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
    10. mExitTime = System.currentTimeMillis();
    11. } else {
    12. AppManager.getAppManager().AppExit(MainActivity.this);
    13. }
    14. return true;
    15. }
    16. return super.onKeyDown(keyCode, event);
    17. }

上面就是多层Fragment嵌套监听返回键的代码,直接张贴过来用即可。来源:网络

-——————————————————— 下面是广告 ————————————————————————

个人微信:hll643435675(备注:博客)

更多资源请访问:

https://blog.csdn.net/xudailong_blog/article/details/78762262

慕课视频教程:https://blog.csdn.net/xudailong_blog/article/details/82909611

-——————————————————— 上面是广告 —————————————————-

发表评论

表情:
评论列表 (有 0 条评论,479人围观)

还没有评论,来说两句吧...

相关阅读