网上有很多这样的教程,我找了一个,忘了链接在哪了(等找到补上),主要是
public interface FragmentBackHandler {
boolean onBackPressed();
}
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();
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();
Logger.info("popBackStack ");
return true;
}
Logger.info("handleBackPress false");
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()
&& fragment instanceof FragmentBackHandler && ((FragmentBackHandler) fragment).onBackPressed();
}
}
结果我一直无法捕获,安卓系统是12,难道是不兼容了?
后来调试发现,获取的fragment只有一个,但事实有三个,获取的是NavHostFragment类型,然后查了发现,这是个容器,我应该获取里面的fragment。于是在handleBackPress方法里加了
if (fragments.size() == 1 && fragments.get(0) instanceof androidx.navigation.fragment.NavHostFragment) {
androidx.navigation.fragment.NavHostFragment host = (androidx.navigation.fragment.NavHostFragment) fragments.get(0);
FragmentManager fm2 = host.getChildFragmentManager();
fragments = fm2.getFragments();
}
好了,成功在fragment中获取到返回键了。