Fragment2显示时如何禁用下层Fragment1的点击事件?
解决Fragment点击事件被下层Fragment拦截的问题
方案一:让Fragment2的根布局消费点击事件
这是最简便的处理方式,直接在Fragment2的根布局XML中添加以下属性:
android:clickable="true" android:focusable="true"
Fragment2的根View会拦截所有未被其子控件消费的点击事件,不会传递到下层的Fragment1。如果Fragment2内有需要响应点击的子控件,正常设置点击事件即可,子控件的点击优先级高于根布局。
方案二:动态控制Fragment1的可点击状态
在添加Fragment2时禁用Fragment1的点击响应,移除Fragment2时恢复:
- 添加Fragment2的代码中补充逻辑:
FragmentTransaction transaction = ((ActivityMain) mContext).getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(0, 0, R.anim.open_main, R.anim.close_next); transaction.add(R.id.frag_container, fragment); // 找到Fragment1并禁用其点击能力 Fragment1 fragment1 = (Fragment1) ((ActivityMain) mContext).getSupportFragmentManager().findFragmentById(R.id.frag_container); if (fragment1 != null && fragment1.getView() != null) { fragment1.getView().setClickable(false); fragment1.getView().setEnabled(false); } transaction.commit();
- 移除Fragment2时(比如在Fragment2的
onDestroyView方法、返回键处理逻辑中)恢复:
Fragment1 fragment1 = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.frag_container); if (fragment1 != null && fragment1.getView() != null) { fragment1.getView().setClickable(true); fragment1.getView().setEnabled(true); }
方案三:结合hide/show方法(需适配动画)
如果你的动画需求允许,可以在添加Fragment2时隐藏Fragment1,移除时再显示它,这样Fragment1的View不会接收任何事件:
// 添加Fragment2时 Fragment1 fragment1 = (Fragment1) ((ActivityMain) mContext).getSupportFragmentManager().findFragmentById(R.id.frag_container); FragmentTransaction transaction = ((ActivityMain) mContext).getSupportFragmentManager().beginTransaction(); transaction.setCustomAnimations(0, 0, R.anim.open_main, R.anim.close_next); transaction.add(R.id.frag_container, fragment); if (fragment1 != null) { transaction.hide(fragment1); } transaction.commit();
移除Fragment2时:
Fragment1 fragment1 = (Fragment1) getSupportFragmentManager().findFragmentById(R.id.frag_container); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.remove(fragment2); if (fragment1 != null) { transaction.show(fragment1); } transaction.commit();
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

