一、问题现象

多层fragment叠加时,点击上层fragment会使下层fragment的控件对应点击事件响应,这种现象就是点击穿透。

对于这种情况,我们一般都是对baseFragment进行view的点击事件设置,以达到拦截所有页面上的空白处点击事件,以防止穿透到下层fragment。

二、解决方案

 /**
* 防止点击穿透
* @param view
* @param savedInstanceState
*/
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// 拦截触摸事件,防止泄露下去
view.setOnTouchListener(this);
}

完整的Fragment代码:

public abstract class BaseFragment extends Fragment implements View.OnTouchListener {
/**
* 贴附的activity
*/
protected FragmentActivity mActivity; /**
* 根view
*/
protected View mRootView; /**
* 是否对用户可见
*/
protected boolean mIsVisible;
/**
* 是否加载完成
* 当执行完oncreatview,View的初始化方法后方法后即为true
*/
protected boolean mIsPrepare; @Override
public void onAttach(Context context) {
super.onAttach(context);
mActivity = (FragmentActivity) getActivity();
} public void startToFragment(Context context, int container, Fragment newFragment){ FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(container,newFragment);
transaction.addToBackStack(context.getClass().getName());
transaction.commit();
} @Override
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
mRootView = inflater.inflate(setLayoutResouceId(), container, false); initData(getArguments()); initView(); mIsPrepare = true; onLazyLoad(); setListener(); return mRootView;
} /**
* 初始化数据
*
* @param arguments 接收到的从其他地方传递过来的参数*/
protected void initData(Bundle arguments) { } /**
* 初始化View*/
protected void initView() { } /**
* 设置监听事件*/
protected void setListener() { } @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser); this.mIsVisible = isVisibleToUser; if (isVisibleToUser) {
onVisibleToUser();
}
} /**
* 用户可见时执行的操作*/
protected void onVisibleToUser() {
if (mIsPrepare && mIsVisible) {
onLazyLoad();
}
} /**
* 懒加载,仅当用户可见切view初始化结束后才会执行*/
protected void onLazyLoad() { } @SuppressWarnings("unchecked")
protected <T extends View> T findViewById(int id) {
if (mRootView == null) {
return null;
} return (T) mRootView.findViewById(id);
} /**
* 设置根布局资源id*/
protected abstract int setLayoutResouceId(); /**
* 防止点击穿透*/
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// 拦截触摸事件,防止泄露下去
view.setOnTouchListener(this);
} @Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
}

最新文章

  1. css常用属性汇总
  2. 3D数学的实际应用
  3. ArcGIS制图之Subset工具点抽稀
  4. ios开发--一个苹果证书怎么多次使用——导出p12文件
  5. 实例源码--ZXing识别条形码和二维码识别源码
  6. 如何判断C#的Finalizer线程有没有被阻塞
  7. Altium Designer中各层的含义
  8. 04747_Java语言程序设计(一)_第5章_图形界面设计(一)
  9. 单链表的实现---SingleLinkedList
  10. leetcode HouseRobber Dp Code
  11. gradient渐变IE兼容处理
  12. Tomcat启动一闪而过
  13. C# 一般处理程序ashx接收服务端post过来json数据
  14. Python之Flask笔记
  15. 033_linux操作系统火焰图探测系统性能
  16. V-rep学习笔记:切削
  17. [转]RabbitMQ学习之:(十二)在Node.js环境下使用RabbitMQ
  18. cf792b循环链表
  19. C# SQLite 数据库操作
  20. 中断 http请求 正在加载 取消http请求

热门文章

  1. 添加-ObjC的含义
  2. 为什么每一个爬虫工程师都应该学习 Kafka
  3. HDU-1274
  4. Python爬虫爬取异步加载的数据
  5. 超酷3D照片展示效果
  6. Linux-(2)Linux安装
  7. Python3 函数基础1
  8. 【CSS】346- 你所不知道的 CSS 阴影技巧与细节
  9. 《Dotnet9》建站-本站使用的什么主题?
  10. Vue之使用JsonView来展示Json树