안드로이드에서 웹뷰를 사용하여 거의 필수적으로 들어가는 작업일 수 있습니다.
일반적인 웹페이지를 보여주기에는 특별하게 필요한 작업은 거의 없습니다.
val url = "노출하려는 웹페이지 링크"
WebView(context).loadUrl(url)
물론 이렇게만 해서 웹뷰를 개발했다고 얘기 할 수는 없겠지만 원하는 페이지를 확인하는 것은 문제 없을 것입니다.
그래도 웬만한 사이트들이 노출되는 것을 확인 할 수 있습니다,
하지만 실제로 버튼 터치도 해야하고 여러 웹 기능이 필요하다는 것을 느끼고 웹뷰의 settings 을 건들게 됩니다.
WebView(context).apply {
setBackgroundColor(Color.WHITE) // 백그라운드 색상 설정
setLayerType(View.LAYER_TYPE_SOFTWARE, null) // 랜더링 이슈 해결
try {
settings.apply {
javaScriptEnabled = true // 자바스크립트 사용 가능하도록 설정
loadWithOverviewMode = true // 전체 웹페이지를 화면에 맞게 로드
useWideViewPort = true // 화면에 맞게 페이지 확대/축소
domStorageEnabled = true // DOM 저장소 사용 가능하도록 설정
setSupportMultipleWindows(true)
javaScriptCanOpenWindowsAutomatically = true // 팝업창 차단 해제
cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
textZoom = 100 // system 에 의한 글꼴 변형 방지
defaultTextEncodingName = "UTF-8" // 인코딩 설정
allowContentAccess = true // 웹뷰를 통해 content url에 접근할지 여부
layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING // 웹페이지의 레이아웃을 화면에 맞게 자동으로 조정
}
} catch (ignore: NoSuchMethodError) {}
loadUrl(url) // 웹페이지 연결
}
사실 웬만하면 이 정도에서 어지간한 웹페이지가 잘 표시되고 기능도 잘 동작할 것 입니다.
하지만 어떤 특정 웹페이지들은 끝끝내 표시 되지 않는 경우도 있습니다.
최근 이 상황에서 많은 어려움이 있었고 다음과 같이 문제를 해결 할 수 있었습니다.
WebView(context).apply {
setBackgroundColor(Color.WHITE) // 백그라운드 색상 설정
setLayerType(View.LAYER_TYPE_SOFTWARE, null) // 랜더링 이슈 해결
...
webViewClient = object : WebViewClient() {
...
override fun onPageFinished(view: WebView?, url: String?) {
val height = webView?.contentHeight
val layoutParams = webView?.layoutParams
layoutParams?.height = height
webView?.layoutParams = layoutParams
}
...
}
...
loadUrl(url) // 웹페이지 연결
}
웹뷰에서 webViewClient 설정이 가능한데 여기에서 페이지 로딩이 완료된 상황에서 웹뷰의 높이를 지정해주는 방법입니다.
웹페이지의 높이가 화면의 높이보다 크면 웹페이지가 화면에 보이지 않을 수 있습니다.
onPageFinished() 이벤트는 웹페이지가 로드되면 호출됩니다. 이 이벤트에서 웹페이지의 높이를 가져와 WebView의 layoutParams 속성에 설정하면 웹페이지의 높이가 화면의 높이에 맞게 조정됩니다.
따라서, 이 코드를 추가하면 웹페이지가 로드된 후 웹페이지의 높이가 화면의 높이에 맞게 조정되므로, 웹페이지가 보이지 않았던 문제가 해결됩니다.
감사합니다.