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 } }
参考
- WebView | Android Developers
- android - How to enable zoom controls and pinch zoom in a WebView? - Stack Overflow
- android - WebView double tap zoom not working on a Motorola Droid A855 - Stack Overflow
- Android Fragment handle back button press - Stack Overflow
- java - android webview stay in app - Stack Overflow
(本当に stackoverflow 様様だなぁ)