java.lang.Object的 | ||||
? | android.view.View | |||
? | android.view.ViewGroup | |||
? | android.widget.AbsoluteLayout | |||
? | android.webkit.WebView |
一个显示网页的视图,这个类在您的Activity上可以简单的显示一些在线内容,从而推出自己定制的浏览器。它使用Webkit渲染引擎来显示网页和其他更多功能包括历史记录向前导航,向后,放大和缩小,执行文本搜索。
想要启用内置的缩放,需要设置WebSettings.setBuiltInZoomControls的(boolean)(介绍在API CUPCAKE中)。请注意,为了一个webview在你的Activity访问互联网和加载网页,你必须添加到你的Android的Manifest文件中的Internet权限:
<span class="tag" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);"><uses-permission</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="atn" style="padding: 0px; margin: 0px; color: rgb(136, 34, 136);">android:name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="atv" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"android.permission.INTERNET"</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="tag" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">/></span>
这必须是一个元素的子元素。请查看教程: Building Web Apps in WebView.。
<pre class="prettyprint" name="code" style="margin-top: 0px; margin-bottom: 1em; background-color: rgb(247, 247, 247); font-size: 14px; border: 1px solid rgb(221, 221, 221); font-family: 'courier new', courier, monospace; overflow: auto; padding: 1em; white-space: pre-wrap; word-wrap: break-word; color: rgb(0, 102, 0); line-height: 1.5;"><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Uri</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> uri </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Uri</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">parse</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"http://www.example.com"</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Intent</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> intent </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">new</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Intent</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Intent</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">ACTION_VIEW</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> uri</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> startActivity</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">intent</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span>
更多信息请阅读Intent
意图.。
要提供一个webview在自己的Activity中,包括在你的布局,WebView的窗口设置在Activity的 onCreate()
:方法中;
<span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">WebView</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">new</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">WebView</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">this</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> setContentView</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span>
<span style="background-color: rgb(249, 249, 249); color: rgb(34, 34, 34); font-family: Roboto, sans-serif; line-height: 19px;">然后加载所需的网页:</span>
// 最简单的用法:注意异常不会被抛出<span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);"></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span> // 如果载入此页有错误(见下文)<span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);"></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">loadUrl</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"http://slashdot.org/"</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span>//或者,你也可以加载一个HTML字符串<span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);"></span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> summary </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"<html><body>You scored <b>192</b> points.</body></html>"</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">loadData</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">summary</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"text/html"</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">null</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span> // ... 但是请注意这对HTML有限制 // 更多的信息请看loaddata()和loaddatawithbaseurl()的javadocs文档
<span style="color: rgb(34, 34, 34); background-color: rgb(249, 249, 249); font-family: Roboto, sans-serif; line-height: 19px;">一个webview有几个自定义点,在这里你可以添加你自己的行为。这些是:</span>
下面是一个更复杂的例子,显示的错误处理,设置和进度通知:
<pre class="prettyprint" name="code" style="border: 1px solid rgb(221, 221, 221); background-color: rgb(247, 247, 247); font-family: 'courier new', courier, monospace; overflow: auto; font-size: 14px; margin-top: 0px; margin-bottom: 1em; padding: 1em; white-space: pre-wrap; word-wrap: break-word; color: rgb(0, 102, 0); line-height: 1.5;"><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">// Let's display the progress in the activity title bar, like the</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">// browser app does.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> getWindow</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">().</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">requestFeature</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Window</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">FEATURE_PROGRESS</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">getSettings</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">().</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">setJavaScriptEnabled</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">true</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">final</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Activity</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> activity </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">this</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">setWebChromeClient</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">new</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">WebChromeClient</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">public</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> onProgressChanged</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">WebView</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> view</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> progress</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">// Activities and WebViews measure progress with different scales.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="com" style="padding: 0px; margin: 0px; color: rgb(136, 0, 0);">// The progress meter will automatically disappear when we reach 100%</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> activity</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">setProgress</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">progress </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="lit" style="padding: 0px; margin: 0px; color: rgb(0, 102, 102);">1000</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">});</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">setWebViewClient</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">new</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">WebViewClient</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">public</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">void</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> onReceivedError</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">WebView</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> view</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="kwd" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> errorCode</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> description</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">String</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> failingUrl</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">makeText</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">activity</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"Oh no! "</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">+</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> description</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="typ" style="padding: 0px; margin: 0px; color: rgb(102, 0, 102);">Toast</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">LENGTH_SHORT</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">).</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">show</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">});</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> webview</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);">loadUrl</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">(</span><span class="str" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"http://slashdot.org/"</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">);</span>
为了安全起见,你的应用程序需要使用自己的缓存,它不共享浏览器应用程序的数据。默认情况下,通过HTML打开新窗口的请求被忽略。无论是通过JavaScript或链路上的目标属性打开,这是真的。你可以定制你的 WebChromeClient
提供你自己打开多个窗口的行为,这可以使你随意控制他们的任何方式。标准的行为是要销毁并重新创建一个活动时,更改设备的方向或任何其他配置。这将导致的WebView重新载入当前页面。如果你不希望出现这种情况,您可以将您的Activity屏幕方向和keyboardHidden的变化,然后单独退出WebView。它会自动重新适配自己。运行时如何处理配置更改请阅读更多信息,Handling
Runtime Changes 。
一个的移动设备的屏幕密度是根据在屏幕上的分辨率。低密度的屏幕每英寸的可用像素较少,一个高密度屏幕在每英寸像素效果显著更多 - 。一个屏
window.devicePixelRatio
DOM属性。此属性的值指定了默认的比例因子,用于当前设备。例如,如果window.devicePixelRatio值是“1.0”,则该设备被认为一个中等密度(MDPI)的移动设备和默认缩放系数不施加到在网页;如果该值是“1.5”,则该设备是认为是一个高密度的移动设备(HDPI)和页面内容进行缩放1.5倍,如果该值是“0.75”,则该设备被认为一个低密度的移动设备(LDPI)和内容缩放0.75倍。但是,如果您指定“目标densitydpi”元属性(下面讨论),那么你可以停止这个默认的缩放行为。-webkit-device-pixel-ratio
CSS样式查询。使用指定的屏幕密度,该样式表是分别相应的值必须是“0.75”,“1”,或“1.5”,表示方式是低密度<pre class="prettyprint" name="code" style="border: 1px solid rgb(221, 221, 221); background-color: rgb(247, 247, 247); font-family: 'courier new', courier, monospace; overflow: auto; font-size: 14px; margin-top: 5px; margin-bottom: 5px; padding: 1em; white-space: pre-wrap; word-wrap: break-word; color: rgb(0, 102, 0); line-height: 1.5;"><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="tag" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);"><link</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="atn" style="padding: 0px; margin: 0px; color: rgb(136, 34, 136);">rel</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="atv" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"stylesheet"</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="atn" style="padding: 0px; margin: 0px; color: rgb(136, 34, 136);">media</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="atv" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"screen and (-webkit-device-pixel-ratio:1.5)"</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="atn" style="padding: 0px; margin: 0px; color: rgb(136, 34, 136);">href</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="atv" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"hdpi.css"</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="tag" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">/></span>
样式表仅用于设备的屏幕像素比为1.5,这是高密度的像素比例。
对于viewport meta标签的target-densitydpi
属性.
你可以指定的Web页面的目标密度,使用以下值:默认缩放将永远不会发生:
device-dpi
-使用设备的原始分辨率为目标的DPI。默认缩放不会发生.high-dpi
-使用hdpi、低密度的屏幕缩小适当.medium-dpi
- 使用mdpi.
高密度屏幕的扩大和低密度屏幕缩小low-dpi
-使用ldpi.
中,高密度屏适当扩大.
-指定要使用的DPI
DPI值(可接受的值是70-400).下面是一个meta标签指定目标密度的例子:
<pre class="prettyprint" name="code" style="border: 1px solid rgb(221, 221, 221); background-color: rgb(247, 247, 247); font-family: 'courier new', courier, monospace; overflow: auto; font-size: 14px; margin-top: 5px; margin-bottom: 5px; padding: 1em; white-space: pre-wrap; word-wrap: break-word; color: rgb(0, 102, 0); line-height: 1.5;"><span class="tag" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);"><meta</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="atn" style="padding: 0px; margin: 0px; color: rgb(136, 34, 136);">name</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="atv" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"viewport"</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="atn" style="padding: 0px; margin: 0px; color: rgb(136, 34, 136);">content</span><span class="pun" style="padding: 0px; margin: 0px; color: rgb(102, 102, 0);">=</span><span class="atv" style="padding: 0px; margin: 0px; color: rgb(0, 136, 0);">"target-densitydpi=device-dpi"</span><span class="pln" style="padding: 0px; margin: 0px; color: rgb(0, 0, 0);"> </span><span class="tag" style="padding: 0px; margin: 0px; color: rgb(0, 0, 136);">/></span>
如果你想修改网页密度, 就使用 -webkit-device-pixel-ratio
CSS3 Media Query 并/或 window.devicePixelRatio
DOM
属性 然后你应该设置 target-densitydpi
meta 属性为 device-dpi
.
这将阻止Android的在你的网页进行缩放,并允许你为所有像素密度通过CSS和JavaScript做出必要的调整。
WebChromeClient,
Nested Classes | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
WebView.FindListener | 监听查找结果的接口 | |||||||||
|
WebView.HitTestResult | ||||||||||
|
WebView.PictureListener | 不推荐使用此接口在API级别12。该接口是现在已经过时。 | |||||||||
|
WebView.WebViewTransport | 返回的WebView跨线程边界传输对象 |
[Expand]
|
---|
[Expand]
继承XML 属性
|
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
|||||||||||
![]() |
常量 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
String | SCHEME_GEO | URI scheme for map address. | |||||||||
String | SCHEME_MAILTO | URI scheme for email address. | |||||||||
String | SCHEME_TEL | URI scheme for telephone number. |
继承的常量
|
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
|||||||||||
![]() |
[展开]
继承的字段
|
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
公共构造函数 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
一个Context对象构造一个新的WebView。
|
||||||||||
|
构造一个新的WebView与布局参数。
|
||||||||||
|
构造一个新的WebView与布局参数和默认样式。
|
||||||||||
|
这个构造函数在API等级17是不推荐。私人浏览功能不再支持直接通过WebView,将在未来的版本中删除。不再私自访问
WebSettings ,而改用WebViewDatabase ,CookieManager 和WebStorage 的进行隐私数据操作和细粒度的控制。 |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
将Java对象提供到Web视图
|
||||||||||
|
获取WebView一个回溯的历史事项
|
||||||||||
|
页面是否后退或前进,或给定数目的后退或前进。
|
||||||||||
|
获取的WebView有一个向前的历史记录项。
|
||||||||||
|
不推荐使用此方法 API level17。这种方法很容易出现不准确的网页渲染和UI线程之间的竞争条件;建议使用
onScaleChanged(WebView,
float, float) . |
||||||||||
|
这种方法被废弃APIlevel17。这种方法很容易由于种族的网页渲染UI线程之间;建议
onScaleChanged(WebView,
float, float) . |
||||||||||
|
捕捉当前WebView的图片
|
||||||||||
|
清除资源缓存.
|
||||||||||
|
从目前的表单域自动删除弹出,如果存在的话
|
||||||||||
|
告诉WebView清除其内部的向后/向前列表。
|
||||||||||
|
|
||||||||||
|
清除存储响应与SSL证书错误.
|
||||||||||
|
清除此Web视图,如果measurespec不measurespec.exactly。ondraw()将只有白色的背景,并onmeasure()将返回0,
|
||||||||||
|
调用父类请求子类更新其mScrollX 和mScrollY的值.
|
||||||||||
|
获取此Web视图的webbackforwardlist。
|
||||||||||
|
销毁WebView的内部状态.
|
||||||||||
|
调度下一个视图的焦点路径上的关键事件..
|
||||||||||
|
查询文件,看它是否包含任何图片引用。
|
||||||||||
|
Dumps custom children to hierarchy viewer.
|
||||||||||
|
获取一个物理位置的地址的第一个子串
|
||||||||||
|
这种方法不推荐 API
level 16. 首选
findAllAsync(String) |
||||||||||
|
异步的查找网页上所有的实例
|
||||||||||
|
Returns a View to enable grabbing screenshots from custom children returned in dumpViewHierarchyWithProperties.
|
||||||||||
|
滚动并加亮到下一个匹配的
findAllAsync(String) ,
直到网页边界 |
||||||||||
|
|
||||||||||
|
通知当前的WebView内存是低的,以便它可以释放任何可用的内存
|
||||||||||
|
获取主要顶层页的SSL证书,或者null,如果没有证书(该网站是不安全的)。
|
||||||||||
|
获取的HTML内容的高度。
|
||||||||||
|
获取当前页的图标。
|
||||||||||
|
Gets a HitTestResult based on the current cursor node.
|
||||||||||
|
对于一个给定的主机和域检索HTTP身份验证凭据.
|
||||||||||
|
获取当前页面的原始URL..
|
||||||||||
|
获取当前页面的进度.
|
||||||||||
|
不推荐使用此方法在API等级17。此方法很容易造成不准确的网页渲染和UI线程之间的竞争。建议
onScaleChanged(WebView,
float, float) . |
||||||||||
|
获取WebSettings的对象,用于控制设置此WebView.
|
||||||||||
|
获取当前页面的标题.
|
||||||||||
|
获取当前页面的URL.
|
||||||||||
|
返回到这个Web视图的历史记录.
|
||||||||||
|
从当前的步骤数跳转到历史记录的指定步骤数。.
|
||||||||||
|
WebView的历史记录前进
|
||||||||||
|
当前WebView调用图形变焦选择器.
|
||||||||||
|
获取此WebView私人浏览是否已启用.
|
||||||||||
|
这个WebView加载 由“data” 给定的数据
构建成的URL
|
||||||||||
|
Loads the given data into this WebView, using baseUrl as the base URL for the content.
|
||||||||||
|
加载此URL.
|
||||||||||
|
加载给定的URL指定额外的HTTP标头.
|
||||||||||
|
这种方法被废弃在API
level8。WebView不再需要viewgroup.onhierarchychangelistener。这种方法现在不会实现。
|
||||||||||
|
这种方法被废弃在API
level8。WebView不再需要viewgroup.onhierarchychangelistener。这种方法现在不会实现。
|
||||||||||
|
创建一个新的InputConnection InputMethod与视图交互
|
||||||||||
|
实现这个方法来处理通用的手势事件
|
||||||||||
|
不推荐使用此方法 API level3。不应该执行WebView ViewTreeObserver.OnGlobalFocusChangeListener。这种方法现在什么也不做。
|
||||||||||
|
实现这个方法来处理悬停事件.
|
||||||||||
|
|
||||||||||
|
初始化AccessibilityNodeInfo 关于视图的信息. |
||||||||||
|
|
||||||||||
|
默认实现
KeyEvent.Callback.onKeyMultiple() :
总是返回false (不处理这个事件). |
||||||||||
|
|
||||||||||
|
暂停WebView和其相关联的DOM,插件,JavaScript 等任何额外的处理
|
||||||||||
|
恢复webview在onPause()前后.
|
||||||||||
|
实现这个方法处理手势事件。.
|
||||||||||
|
实现这个方法处理轨迹球运动事件.
|
||||||||||
|
当窗口被扣调用或者失去焦点.
|
||||||||||
|
获取水平滚动条是否有叠加样式
|
||||||||||
|
Gets whether vertical scrollbar has overlay style.
|
||||||||||
|
滚动WebView页面大小一半内容
|
||||||||||
|
向上滚动WebView页面大小一半内容
|
||||||||||
|
暂停webview 所有布局,解析,javaScript times计时器
|
||||||||||
|
在视图上执行指定的动作
|
||||||||||
|
如果被定义将调用调用view的OnLongClickListener
|
||||||||||
|
webview使用"Post"方法加载URL ,附带postData 数据。
|
||||||||||
|
重新载入当前URL.
|
||||||||||
|
从这个web视图中移除先前注入的Java对象.
|
||||||||||
|
当一组子类需要将一个特殊的矩形定为到屏幕上.
|
||||||||||
|
调用该函数来尝试给予指定的视图或者其子类焦点和方向和特定矩形. 直到符合要求 by
getDescendantFocusability() . |
||||||||||
|
请求最后锚点或图像元素的URL
|
||||||||||
|
最后一个接触的用户请求的URL的图像
|
||||||||||
|
这从给定的Bundle对象恢复WebView的状态,
|
||||||||||
|
恢复WebViews所有的布局,解析和JavaScript计时器
|
||||||||||
|
设置为指定的主机的用户名和密码.
|
||||||||||
|
|
||||||||||
|
保存当前视图作为Web存档.
|
||||||||||
|
保存当前视图作为Web存档
|
||||||||||
|
设置视图的背景颜色
|
||||||||||
|
这种方法被废弃APIlevel17。调用这个函数没有有用的效果,并将在以后的版本中被忽略。.
|
||||||||||
|
当内容不能被渲染引擎处理和不应该下载时注册一个接口来使用
|
||||||||||
|
在网页上查找操作进展通知注册监听器
|
||||||||||
|
指定水平滚动条是否有叠加样式
|
||||||||||
|
为一个给定的主机和领域存储HTTP身份验证凭据
|
||||||||||
|
设置WebView初始比例
|
||||||||||
|
为视图的层指定类别. |
||||||||||
|
设置此视图关联的布局参数
|
||||||||||
|
默认的情况下不推荐使用此方法 API level17。,实际将在未来的版本中支持.
|
||||||||||
|
通知WebView的网络状态
|
||||||||||
|
设置该视图的滚动模式
|
||||||||||
|
不推荐使用此方法 API level12。这个方法现在已经过时。.
|
||||||||||
|
指定滚动条的样式. |
||||||||||
|
指定垂直滚动条是否有叠加样式.
|
||||||||||
|
设置脚本处理.
|
||||||||||
|
设置WebViewClient会接收到各种通知和请求
|
||||||||||
|
如果是按下的状态应推迟到子类或其子类下返回true
|
||||||||||
|
在这个页面开始查找文本
|
||||||||||
|
停止当前的加载.
|
||||||||||
|
执行放大该webView
|
||||||||||
|
执行缩小该webview
|
Protected Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
计算的水平滚动条上的滑块水平范围内的水平偏移量 |
||||||||||
|
计算水平滚动条的水平距离 |
||||||||||
|
计算的水平滚动条上的滑块垂直范围内的垂直距离 |
||||||||||
|
计算的垂直滚动条上的滑块水平范围内的垂直偏移 |
||||||||||
|
计算的垂直滚动条的垂直距离. |
||||||||||
|
当这个视图连接一个窗口则调用.
|
||||||||||
|
目前正在使用的应用程序的资源配置改变时调用
|
||||||||||
|
当这个视图脱离一个窗口则调用.
|
||||||||||
|
实现绘制
|
||||||||||
|
当系统的一个视图的焦点状态改变时调用
|
||||||||||
|
测量视图和它的内容来确定测量宽度和测量高度. |
||||||||||
|
|
||||||||||
|
当此视图内部内容滚动时回调此响应
|
||||||||||
|
当视图的大小改变期间回调
|
||||||||||
|
当视图可见状态或视图的父类可见状态改变.
|
||||||||||
|
|
在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等。
使用WebView时需在AndroidManifest.xml添加如下权限,否则会出Web page not available错误。:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />(有的甚至要加这个权限)
设置WebView基本信息:
mWebview.getSettings().setJavaScriptEnabled(true);//设置支持Javascript requestFocus();//如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。 this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY); mWebView.loadUrl(“http://www.google.com“); //互联网用 mWebView.loadUrl(“file:///android_asset/XX.html“);//本地文件用 本地文件存放在:assets文件中
ws.setSupportZoom(true); // support zoom //ws.setDefaultZoom(WebSettings.ZoomDensity.FAR) ; ws.setBuiltInZoomControls(true); //page auto adapter ws.setUseWideViewPort(true); ws.setLoadWithOverviewMode(true);
WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。
mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边 view.loadUrl(url); return true; }
//此方法可以处理webview 在加载时和加载完成时一些操作 mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { if(newProgress==100){ // 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作 title.setText(“加载完成”); }else{ title.setText(“加载中…….”); } } });
//先在onCreate()方法里设置icon存储的路径 WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath()); //再设置webview的WebChromeClient mWebView.setWebChromeClient(new MyWebChromeClient()); //最后MyWebChromeClient中重写以下方法 @Override public void onReceivedIcon(WebView view, Bitmap icon) { if(icon != null ){ mIconImgeView.setImageBitmap(icon); } }
如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
public boolean onKeyDown(int keyCoder,KeyEvent event){ if(webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){ webview.goBack(); //goBack()表示返回webView的上一页面 return true; } return false; }
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 优先使用缓存 //WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存 //退出时删除缓存,可放到 OnDestory()方法里 File file = CacheManager.getCacheFileBaseDir(); if (file != null && file.exists() && file.isDirectory()) { for (File item : file.listFiles()) { item.delete(); } file.delete(); } mWebView.clearCache(true); context.deleteDatabase("webview.db"); context.deleteDatabase("webviewCache.db");
/** * 处理长按弹出的上下文菜单事件,包括网页链接,图片链接等... */ class Hao123ContextMenuListener implements OnCreateContextMenuListener{ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { HitTestResult result = ((WebView)v).getHitTestResult() ; if(null == result) return ; int type = result.getType(); if (type == WebView.HitTestResult.UNKNOWN_TYPE) return; if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { // let TextView handles context menu return; } MenuInflater inflater = getActivity().getMenuInflater(); inflater.inflate(R.menu.browser_menu, menu); // Show the correct menu group String extra = result.getExtra(); menu.setGroupVisible(R.id.PHONE_MENU, type == WebView.HitTestResult.PHONE_TYPE); menu.setGroupVisible(R.id.EMAIL_MENU, type == WebView.HitTestResult.EMAIL_TYPE); menu.setGroupVisible(R.id.GEO_MENU, type == WebView.HitTestResult.GEO_TYPE); menu.setGroupVisible(R.id.IMAGE_MENU, type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); menu.setGroupVisible(R.id.ANCHOR_MENU, type == WebView.HitTestResult.SRC_ANCHOR_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE); // Setup custom handling depending on the type Intent intent; switch (type) { case WebView.HitTestResult.PHONE_TYPE: //处理拨号 break; case WebView.HitTestResult.EMAIL_TYPE: //处理Email break; case WebView.HitTestResult.GEO_TYPE: //TODO break; case WebView.HitTestResult.SRC_ANCHOR_TYPE: case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项 break; default: break; } } private OnMenuItemClickListener menuItemListener = new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // TODO 各菜单项事件处理 } }; }
1、判断是否安装了flash,若没有跳转到市场安装 http://blog.csdn.net/zircon_1973/article/details/8067041
2、代码里设置支持flash播放
WebSettings ws = mWebView.getSettings(); ws.setJavaScriptEnabled(true) ; ws.setPluginsEnabled(true); //Flash support if(DeviceInfo.getSDKVersionNumber()>7){ //flash support since android 2.2 ws.setPluginState(PluginState.ON); ws.setAllowFileAccess(true); }
AndroidManifest里相应的Activity加上如下代码:
<activity android:name=".BrowserActivity" ...... android:hardwareAccelerated="true" ....... >
mWebView.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent,String contentDisposition, String mimetype,long contentLength) { //实现下载的代码,这里跳转到其他浏览器下载 Uri uri = Uri.parse(url); // Uri uri = Uri.parse("http://www.abc.com/a.apk");如果只下载单个文件 Intent intent = new Intent(Intent.ACTION_VIEW,uri); startActivity(intent); } });
可以参考这个项目
垂直滚动条总是显示白色轨迹底图(无法消掉) 在xml中给WebView设置一下属性发觉不起一点作用:
android:fadeScrollbars = "true" android:scrollbarStyle = "outsideOverlay" android:scrollbarAlwaysDrawVerticalTrack = "false"
必须在代码中对WebView进行设置才能奏效:
webview .setScrollbarFadingEnabled( true ); webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );
E/Web Console(804): Uncaught TypeError: Cannot call method ‘getItem‘ of null at http://z.cdn.turner.com/cnn/tmpl_asset/static/mobile_phone/2273/js/global-min.js:3
加上以下这句即可:
WebSettings settings = webView.getSettings(); settings.setDomStorageEnabled(true);
原文:http://blog.csdn.net/u014608640/article/details/42674189