Fragment return key listener event processing

Copyright statement: This article is an original article of lhk147852369, and follows the CC 4.0 BY-SA copyright agreement. For reprinting, please attach the original source link and this statement.
Link to this article: https://blog.csdn.net/lhk147852369/article/details/78178452

1. Also define a FragmentBackHandler interface first.

public interface FragmentBackHandler {
    
    
    boolean onBackPressed();
}

2. Define a BackHandlerHelper tool class to implement the distribution of back events. The external logic of Fragment and Activity is the same, so both need to call the method of this class.

public class BackHandlerHelper {
    
    

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

        if (fragments == null) return false;

        for (int i = fragments.size() - 1; i >= 0; i--) {
    
    
            Fragment child = fragments.get(i);

            if (isFragmentBackHandled(child)) {
    
    
                return true;
            }
        }

        if (fragmentManager.getBackStackEntryCount() > 0) {
    
    
            fragmentManager.popBackStack();
            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键则返回 <b>true</b>
     */
    public static boolean isFragmentBackHandled(Fragment fragment) {
    
    
        return fragment != null
                && fragment.isVisible()
                && fragment.getUserVisibleHint() //for ViewPager
                && fragment instanceof FragmentBackHandler
                && ((FragmentBackHandler) fragment).onBackPressed();
    }
}

3. Of course, Fragment must also implement the FragmentBackHandler interface (on demand)

//没有处理back键需求的Fragment不用实现
public abstract class BackHandledFragment extends Fragment implements FragmentBackHandler {
    
    
    @Override
    public boolean onBackPressed() {
    
    
        return BackHandlerHelper.handleBackPress(this);
    }
}

4. Activity overrides the onBackPressed method (required)

public class MyActivity extends FragmentActivity {
    
    
    //.....
    @Override
    public void onBackPressed() {
    
    
        if (!BackHandlerHelper.handleBackPress(this)) {
    
    
            super.onBackPressed();
        }
    }
}

Guess you like

Origin blog.csdn.net/huangerbian/article/details/130682930