i++

プログラム系のメモ書きなど

Android : WebView 覚え書き(ズーム関連の機能の有効化、Progress の表示、Back Key のハンドリングなど)

やりたい事 方法
ピンチ操作によるズームイン / ズームアウトの有効化 webview.settings.builtInZoomControls = true
ダブルタップによるズームイン / ズームアウトの有効化 webview.settings.useWideViewPort = true
ズームボタン(右下に表示される±のルーペ)の表示・非表示切り替え webview.settings.displayZoomControls = true/false (ズーム操作不要のページでは true でも表示されません)
プログレスの表示 webview.setWebChromeClient で onProgressChanged を override した WebChromeClient を設定(サンプルコード参照)
バックキーのハンドリング webview.setOnKeyListener で KeyEvent.BACK_KEY のイベントを処理する(サンプルコード参照)
load 時に外部ブラウザを起動しない webview.setWebViewClient(WebViewClient())

※ 方法の列は Kotlin ベースの Property Syntax を使って書いています。Java の場合 webview.getSettings().set***(Boolean) になります

サンプルコード

WebView を持っているレイアウトを使用する Fragment としての例です。
WebView 回りの設定は onCreateView で行っています。

※ こちらも Kotlin です

public class WebViewFragment : Fragment() {
    companion object {
        val ARG_KEY_URL = "ARG_KEY_URL"
        fun newInstance(url:String) : WebViewFragment {
            val fragment = WebViewFragment()
            val args = Bundle()
            args.putString(ARG_KEY_URL, url)
            fragment.arguments = args
            return fragment
        }
    }

    var url:String = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if(arguments != null) {
            url = arguments.getString(ARG_KEY_URL) ?: ""
        }
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater?.inflate(R.layout.fragment_webview_root, container, false)

        val progressbar = view?.findViewById(R.id.fragment_webview_progressbar) as ProgressBar
        val webview = view?.findViewById(R.id.fragment_webview_webview) as WebView

        webview.settings?.builtInZoomControls = true;
        webview.settings?.useWideViewPort = true
        webview.settings?.displayZoomControls = false
        webview.settings?.javaScriptEnabled = true;

        webview.setWebChromeClient(object : WebChromeClient(){
            override fun onProgressChanged(view:WebView, progress:Int) {
                progressbar.progress = progress
                if(progress == 100) {
                    progressbar.animate().setDuration(1000).alpha(0.0f)
                } else {
                    progressbar.alpha = 1.0f
                }
            }
        })

        webview.isFocusableInTouchMode = true
        webview.setOnKeyListener { view, keyCode, keyEvent ->
            if(keyEvent.action == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    if (webview.canGoBack() == true) {
                        webview.goBack()
                        return@setOnKeyListener true
                    }
                }
            }
            return@setOnKeyListener false
        }

        webview.setWebViewClient(WebViewClient())
        webview.loadUrl(url)

        return view
    }
}

参考

(本当に stackoverflow 様様だなぁ)