在安卓开发中,我们经常要对按键进行监听,今天跟大家分享一下最常用的
按下返回退出
功能的实现.
以往在activity中监听返回键我们都是使用onKeyDown来监听,但是在fragment中没有这个方法那么我们应该怎么实现对返回键的监听了,今天就为大家介绍一个方法可以用来监听fragment的返回键。
首先我们定义一个借口BackInterface
/**
* Created by xcl on 2018/4/7.
* 监听手机返回事件
*/
public interface BackInterface {
boolean onBackPressed();
}
然后在写一个工具类
/**
* Created by xcl on 2018/4/7.
* 监听fragment返回键的工具类
*/
public class BackUtil {
/**
* 将back事件分发给 FragmentManager 中管理的子Fragment,如果该 FragmentManager 中的所有Fragment都
* 没有处理back事件,则尝试 FragmentManager.popBackStack()
*
* @return 如果处理了back键则返回 <b>true</b>
* @see #handleBackPress(Fragment)
* @see #handleBackPress(FragmentActivity)
*/
public static boolean BackPress(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 BackPress(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 HandleBackInterface
&& ((HandleBackInterface) fragment).onBackPressed();
}
}
用来处理这些事件
最后实现调用
@Override
public boolean onBackPressed() {
return BackUtil.handleBackPress(this);
}
我在使用时为了监听多个fragment所以写在了父类里
如果你在activity里使用了viewpager来展示fragment这时要想监听返回键就不能先上面那样了
应该在activity里先写这个方法才行
@Override
public void onBackPressed() {
int currentItem = viewPager.getCurrentItem();
HandleBackInterface fragment = (BackInterface) fragments
.get(currentItem);
fragment.onBackPressed();
}