본문 바로가기

안드로이드/팁

Android WebView 유튜브 전체화면 버튼이 안 먹힐 때

반응형

WebView 안에서 iframe으로 유튜브 영상을 띄웠는데
전체화면 버튼을 눌러도 아무 반응이 없는 문제를 겪었다.

처음엔 아래처럼 흔히 생각할 수 있는 부분들을 다 의심했다.

  • WebChromeClient 제대로 붙였나?
  • iframe에 allowfullscreen 빠진 건가?
  • WebView 설정 문제인가?
  • Fragment 구조 때문인가?

근데 결론적으로는 전혀 다른 데 있었다.


문제 상황

  • WebView에 유튜브 iframe 로드
  • 전체화면 버튼 클릭
  • 아무 반응 없음 (로그도 안 찍힘)
webView.webChromeClient = object : WebChromeClient() {
    override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
        // 구현은 되어 있음
    }
}

이렇게 구현해둔 상태였는데,
onShowCustomView() 자체가 아예 호출되지 않았다.


원인 + 해결 방법

결론부터 말하면 이거다.

👉 onShowCustomView만 구현하면 안 된다

반드시 아래 두 개를 같이 override 해야 한다.

override fun onShowCustomView(view: View?, callback: CustomViewCallback?) { ... }

override fun onHideCustomView() { ... }

왜냐하면 WebView 내부에서는 fullscreen 처리를
하나의 흐름(진입/종료)으로 보고 있어서

  • 진입: onShowCustomView
  • 종료: onHideCustomView

이 두 개가 같이 구현되어 있어야 정상적으로 동작한다.

onHideCustomView()가 없으면
fullscreen을 지원하지 않는 상태로 판단해서
onShowCustomView() 자체를 호출하지 않는다.

결국 원인이 곧 해결 방법이었다.


적용 코드

webView.webChromeClient = object : WebChromeClient() {

    override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
        // fullscreen view 처리
    }

    override fun onHideCustomView() {
        // fullscreen 종료 처리
    }
}

이렇게만 바꿔주면
전체화면 버튼이 바로 정상 동작한다.


추가로 겪었던 부분들

이거 해결하고 나면 보통 여기서 한 번 더 막힌다.

  • 상태바가 그대로 남아있는 경우
  • Fragment 안에서 전체화면이 꽉 차지 않는 경우
  • 화면이 일부만 보이는 경우

이건 각각

  • 시스템 UI 숨김 처리
  • Activity의 decorView에 붙이기
  • MATCH_PARENT로 view 추가

이런 식으로 추가 대응이 필요하다.


정리

WebView에서 fullscreen이 안 되는 경우
복잡한 설정 문제보다 단순한 케이스일 때가 많다.

👉 onShowCustomView + onHideCustomView 둘 다 구현했는지 먼저 확인하자

나도 이걸 몰라서 괜히 다른 데서 한참 헤맸다.

반응형