多個Fragment疊加點擊穿透


當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這會讓根布局把點擊事件吃掉,以防止事件會繼續傳遞下去,造成上面的情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM