在做项目,用activity+fragment 填充视图时,
发现有些Fragment会存在点击穿透效果(就是底层的Fragment可以响应上层的触摸以及点击事件)
但是当填充的Fragment的跟布局是ScrollView时就不会有这种现象。
比如:当我们建立一个fragment A的时候需要点击跳转到fragment B中,为了返回时不重新加载fragment A所以我们会使用add的方法来讲fragment A加入到后退栈中
当在fragment B中点击一个空白区域,恰好空白区域相对应的位置在fragment A中有相应的控件,则fragment A会响应到点击事件,如果是列表 还可以滑动。
简单百度一下,还有不少同胞遇到这种问题。并且大致的解决办法是:
在fragment中实现OnTouchListener监听,然后重写View.OnTouchListener的OnTouch方法,将返回值设置为true;在onCreateView方法中的view里面添加OnTouchListener,这样就能让fragment点击的时候不再穿透到上一层的fragment中去了,直接在当前的fragment层给消化掉了。
好麻烦不推荐,其实只要在onCreateView方法返回view时,让其view.setClickable(true);就可以了
/**
* Fragment基类
*
* @author shaoshuai
*
*/
public abstract class BaseFragment extends Fragment {
public View view;
public Context mContext;
public FragmentManager fm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mContext = getActivity();
fm = getFragmentManager();
}
/**
* 构建UI,
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = initView(inflater);
view.setClickable(true);// 防止点击穿透,底层的fragment响应上层点击触摸事件
return view;
}
/**
* 数据填充UI的操作
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
initData(savedInstanceState);
super.onActivityCreated(savedInstanceState);
}
/**
* onCreate方法中构建UI(将xml转换成view对象)
*
* @param inflater
* @return
*/
public abstract View initView(LayoutInflater inflater);
/**
* onActivityCreated方法中请求网络。返回数据填充UI
*
* @param savedInstanceState
*/
public abstract void initData(Bundle savedInstanceState);
}