1. 程式人生 > >Fragment 點選穿透 解決辦法

Fragment 點選穿透 解決辦法

在做專案,用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);

}