Fragment 點選穿透 解決辦法
阿新 • • 發佈:2019-01-02
在做專案,用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); }