상세 컨텐츠

본문 제목

안드로이드 웹뷰에서 페이지가 보이지 않을때 해결 방법 (settings 로 해결 안될때)

Android 자료실/기타 버그

by Victorywskim 2023. 11. 25. 14:46

본문

반응형

 

안드로이드에서 웹뷰를 사용하여 거의 필수적으로 들어가는 작업일 수 있습니다.

 

일반적인 웹페이지를 보여주기에는 특별하게 필요한 작업은 거의 없습니다.

 

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 속성에 설정하면 웹페이지의 높이가 화면의 높이에 맞게 조정됩니다.

따라서, 이 코드를 추가하면 웹페이지가 로드된 후 웹페이지의 높이가 화면의 높이에 맞게 조정되므로, 웹페이지가 보이지 않았던 문제가 해결됩니다.

 

감사합니다.

 

728x90
반응형

관련글 더보기