Android 앱을 구성하다 보면 몇몇 컨텐츠(광고, 배너, 이용약관 등)들을 WebView를 사용하여 표시하곤 합니다.
이런 구성에서 Android의 WebView는 보통 Clipboard와 컨텍스트 메뉴를 표시하기 위해서 Long Click을 이용합니다. 그런과정에서 불필요한 사용자 경험을 고객에게 주게 됩니다.
간단하게 WebView를 설정하여 Long Click과 Anchor의 Highlight를 표시하지 않게 하는 방법을 설명합니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupWebView()
}
@SuppressLint("SetJavaScriptEnabled")
private fun setupWebView() {
...
...
webview_not_long_clickable.run {
settings.let {
it.javaScriptEnabled = true
it.domStorageEnabled = true
}
// #1
setOnLongClickListener { true }
isLongClickable = false
webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
// #2
view?.evaluateJavascript(CSS_BLOCK_HIGHLIGHT, null)
super.onPageFinished(view, url)
}
}
loadUrl(URL)
}
}
companion object {
private const val URL = "https://velog.io/@haejung"
// #3
private const val CSS_BLOCK_HIGHLIGHT = """
javascript:(function() {
var parent = document.getElementsByTagName('head').item(0);
var style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = 'body { -webkit-tap-highlight-color: transparent; };';
parent.appendChild(style)
})()
"""
}
}
#1
WebView
를 설정하는 과정에서 WebView가 View의 상속으로 가지고 있는 속성인 isLongClickable과 OnLongClickListener를 설정해서 임의로 Long Click Event가 WebView에서 처리되지 않도록 합니다.#2
WebView
의 컨텐츠가 모두 로드 된 후에 HTML의 Tab Highlight Color를 투명하게 만드는 CSS를 주입합니다.
style.innerHTML = 'body { -webkit-tap-highlight-color: transparent; };';
주입되는 CSS에서 body 태그의 tab-highlight-color를 변경합니다.
#3