當Fragment棧中有多個add Fragment時,點擊最上層Fragment時的空白處,如果對應的下層Fragment中存在按鈕或其他事件,那么奇妙的事情就發生了,會穿透點擊到下方的事件,不可否認,這是我們不願意看到的。
究其原因:Fragment的本質就是一個View布局的管理器,當Fragment attach到Activity時,其實就是把Fragment#onCreateView()返回的View,替換掉(如果是用replace)FragmentTransaction#replace中指定的View,或者添加到(如果是add)FragmentTransaction#add()中指定的ViewGroup里面。
當我們以層疊方式顯示多個Fragment時,通常的做法就是弄一個FrameLayout,然后每次把Fragment add到此布局。因此,這時Activity的頁面布局樹實際上就是一個FrameLayout里面包含幾個View。
所以,當點擊上面Fragment的空白區域時,如果事件沒被吃掉,就會向下傳遞。
解決方案:
創建BaseFragement
public abstract class CJBaseFragment extends BaseFragment implements View.OnTouchListener {
public SweetAlertDialog pDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pDialog = new SweetAlertDialog(getActivity(), SweetAlertDialog.PROGRESS_TYPE);
pDialog.getProgressHelper().setBarColor(Color.parseColor("#FF4081"));
pDialog.setTitleText("正在加載中...");
pDialog.setCancelable(false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// 攔截觸摸事件,防止泄露下去
view.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
}
其他Fragment可以繼承CJBaseFragment這會讓根布局把點擊事件吃掉,以防止事件會繼續傳遞下去,造成上面的情況。
