(Android/안드로이드) WebView 터치 이벤트가 먹통이 되는 원인과 해결 방법 총정리

개요


1. 구조


2. 가장 흔한 원인 ① setOnTouchListener 반환값

// ❌ 잘못된 코드
webView.setOnTouchListener { _, _ ->
    true
}

// ✅ 올바른 방식
webView.setOnTouchListener { _, _ ->
    false
}

3. 원인 ② 부모 View가 intercept 하는 경우

SwipeRefreshLayout
  └── NestedScrollView
        └── WebView
webView.setOnTouchListener { v, event ->
    v.parent.requestDisallowInterceptTouchEvent(true)
    false
}

4. 원인 ③ NestedScroll 충돌

RecyclerView
   └── WebView
   
ViewPager2
   └── Fragment
        └── WebView
webView.isNestedScrollingEnabled = false
recyclerView.isNestedScrollingEnabled = false

5. 원인 ④ clickable / focusable 설정 문제

webView.isFocusable = true
webView.isFocusableInTouchMode = true

6. 원인 ⑤ hardware acceleration 문제 (특정 단말)

// android:hardwareAccelerated="true"
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null)

7. 원인 ⑥ JS에서 preventDefault()


8. 원인 ⑦ Transparent View overlay

FrameLayout
   ├── WebView
   └── View (alpha=0) <- 이 View가 터치를 먹고 있을 수 있습니다.
view.setOnTouchListener { _, _ ->
    Log.d("Touch", "overlay touched")
    false
}


Related Posts