多层fragment叠加时,点击上层fragment会使下层fragment的控件对应点击事件响应,这种现象就是点击穿透。对于这种状况,咱们通常都是对baseFragment进行view的点击事件设置,以达到拦截全部页面上的空白处点击事件,以防止穿透到下层fragment。ide
/** * 防止点击穿透 * @param view * @param savedInstanceState */ @Override public void onViewCreated(View view, Bundle savedInstanceState) { // 拦截触摸事件,防止泄露下去 view.setOnTouchListener(this); }
完整的baseFragment:布局
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 接收到的从其余地方传递过来的参数 * @author 漆可 * @date 2016-5-26 下午3:57:48 */ protected void initData(Bundle arguments) { } /** * 初始化View * * @author 漆可 * @date 2016-5-26 下午3:58:49 */ protected void initView() { } /** * 设置监听事件 * * @author 漆可 * @date 2016-5-26 下午3:59:36 */ protected void setListener() { } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); this.mIsVisible = isVisibleToUser; if (isVisibleToUser) { onVisibleToUser(); } } /** * 用户可见时执行的操做 * * @author 漆可 * @date 2016-5-26 下午4:09:39 */ protected void onVisibleToUser() { if (mIsPrepare && mIsVisible) { onLazyLoad(); } } /** * 懒加载,仅当用户可见切view初始化结束后才会执行 * * @author 漆可 * @date 2016-5-26 下午4:10:20 */ protected void onLazyLoad() { } @SuppressWarnings("unchecked") protected <T extends View> T findViewById(int id) { if (mRootView == null) { return null; } return (T) mRootView.findViewById(id); } /** * 设置根布局资源id * * @return * @author 漆可 * @date 2016-5-26 下午3:57:09 */ protected abstract int setLayoutResouceId(); /** * 防止点击穿透 * @param view * @param savedInstanceState */ @Override public void onViewCreated(View view, Bundle savedInstanceState) { // 拦截触摸事件,防止泄露下去 view.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { return true; } }