動態新增 TextView 到 RelativeLayout,同時對父佈局與子 View 設定相同 OnTouchListener。父佈局能偵測觸摸但無回應,子 View 設定 setClickable(true) 後導致觸摸事件被消費,父佈局不再接收。
TextView.setClickable(true) 會將 View 標記為可點擊,觸摸事件分發機制下,可點擊的子 View 會消耗觸摸事件,不再向父佈局傳遞(除非子 View onTouchEvent 回傳 false)。
// 刪除這行
// tv.setClickable(true);
// 父佈局正常接收觸摸
relativeLayout.setOnTouchListener(touchListener);
tv.setOnTouchListener((v, event) -> {
// 處理邏輯...
return false; // 關鍵:false 表示未消費,事件繼續向父佈局傳遞
});
在自定義 RelativeLayout 覆寫 onInterceptTouchEvent 統一攔截,適用複雜手勢場景。
dispatchTouchEvent:入口,分發給子 View 或自身 onTouchEvent。onInterceptTouchEvent:ViewGroup 決定是否攔截(true=攔截自行處理,false=分發給子 View)。onTouchListener.onTouch:若設定且回傳 true,消費事件,onTouchEvent 不再執行。onTouchEvent:View 自身處理,clickable=true 時預設消費單擊事件。clickable=true 且無 OnTouchListener 時,仍會消費單擊手勢。true=消費/攔截,false=傳遞/不攔截。GestureDetector 或 ScaleGestureDetector。理解 Android 觸摸事件分發機制,是解決各類觸摸衝突、手勢識別問題的基石。