webview 属性以及整体介绍
来源:互联网 发布:恋爱 知乎 编辑:程序博客网 时间:2024/06/03 18:59
implements ViewGroup.OnHierarchyChangeListener ViewTreeObserver.OnGlobalFocusChangeListener
类概述
一个显示网页的视图,这个类在您的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.。
基本用法
默认情况下,一个网页不提供任何浏览器的插件,不允许javaScript网页错误不可以被忽略。如果你的目标只是显示一些网页作为用户界面的一部分,这可能是好的;用户不需要与网页交互。如果你真的想要一个完全成熟的网络浏览器,那么你可能要调用的是浏览器应用程序,而不是一个webview显
示一个URL意图。例如:
<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>
- 创建和设置WebChromeClient的子类,当浏览器的UI发生变化时调用,如:进度条更改、JavaScript的窗口。
(见Debugging Taskshttp://developer.android.com/tools/debugging/index.html) - 创建和设置WebViewClient子类,当底层内容变化时调用,如:错误或表单提交。你也可以再次拦截URL调用。
(通过shouldOverrideUrlLoading()) - 修改WebSettings,例如:让JavaScript可用--setJavaScriptEnabled().
- 增加JavaScript-to-Java接口addJavascriptInterface(Object,String)。
可以将java对象绑定到WebView,这样对象可以被网页的JavaScript控制。
下面是一个更复杂的例子,显示的错误处理,设置和进度通知:
<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>
Cookie和窗口管理
为了安全起见,你的应用程序需要使用自己的缓存,它不共享浏览器应用程序的数据。默认情况下,通过HTML打开新窗口的请求被忽略。无论是通过JavaScript或链路上的目标属性打开,这是真的。你可以定制你的 WebChromeClient
提供你自己打开多个窗口的行为,这可以使你随意控制他们的任何方式。标准的行为是要销毁并重新创建一个活动时,更改设备的方向或任何其他配置。这将导致的WebView重新载入当前页面。如果你不希望出现这种情况,您可以将您的Activity屏幕方向和keyboardHidden的变化,然后单独退出WebView。它会自动重新适配自己。运行时如何处理配置更改请阅读更多信息,Handling Runtime Changes 。
制作支持不同的屏幕密度的网页
一个的移动设备的屏幕密度是根据在屏幕上的分辨率。低密度的屏幕每英寸的可用像素较少,一个高密度屏幕在每英寸像素效果显著更多 - 。一个屏幕的密度是很重要的,因为,其他条件都相同,在UI元素(例如,一个按钮),其高度和宽度被定义在屏幕像素方面会出现较大的和较小的密度较低的
屏幕上的更高密度的屏幕上。为简单起见,Android折叠所有实际的屏幕密度为:高,中,低三个广义密度。
缺省情况下,web视图缩放一个网页,以便它被绘制在中等密度的屏幕上的尺寸相匹配的默认外观。因此,在高密度屏幕采用1.5倍缩放(因为它的像素较小)和0.75倍缩放一个低密度画面上(因为它的像素大)。开始的WebView支持API级ECLAIR,DOM,CSS,和meta标签的功能,以帮助您作为一个web开发目标不同的屏幕密度的屏幕。这里有一个总结的功能,你可以用它来处理不同的屏幕密度:
-
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”,表示方式是低密度
,中密度或高密度的设备,屏幕,分别。比如说:example:<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做出必要的调整。
HTML5 视频 播放支持
WebChromeClient,
对于全屏的支持需要onShowCustomView(View, WebChromeClient.CustomViewCallback)
和 onHideCustomView()
可选getVideoLoadingProgressView()
Summary
WebSettings
,而改用WebViewDatabase
,CookieManager
和WebStorage
的进行隐私数据操作和细粒度的控制。onScaleChanged(WebView, float, float)
.onScaleChanged(WebView, float, float)
.findAllAsync(String)
.创建出的显示强调突出的文本。findAllAsync(String)
findAllAsync(String)
, 直到网页边界onScaleChanged(WebView, float, float)
.AccessibilityEvent
事件源信息.初始化AccessibilityNodeInfo
关于视图的信息.KeyEvent.Callback.onKeyDown()
: 如果视图是有效并且可点击,执行按下视图直到 KEYCODE_DPAD_CENTER
orKEYCODE_ENTER
释放, KeyEvent.Callback.onKeyMultiple()
: 总是返回false (不处理这个事件).KeyEvent.Callback.onKeyUp()
: 执行点击直到 KEYCODE_DPAD_CENTER
orKEYCODE_ENTER
释放.getDescendantFocusability()
.onSaveInstanceState(Bundle)
.为视图的层指定类别.
指定滚动条的样式.
计算的水平滚动条上的滑块水平范围内的水平偏移量
计算水平滚动条的水平距离
计算的水平滚动条上的滑块垂直范围内的垂直距离
计算的垂直滚动条上的滑块水平范围内的垂直偏移
计算的垂直滚动条的垂直距离.
测量视图和它的内容来确定测量宽度和测量高度.
overScrollBy(int, int, int, int, int, int, int, int, boolean)
回应的滚动操作的结果。GONE
, INVISIBLE
, and VISIBLE
).在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);//设置支持JavascriptrequestFocus();//如果不设置,则在点击网页文本输入框时,不能弹出软键盘及不响应其他的一些事件。this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY); mWebView.loadUrl(“http://www.google.com“); //互联网用mWebView.loadUrl(“file:///android_asset/XX.html“);//本地文件用 本地文件存放在:assets文件中
一、基本用法
1、设置缩放页面自适应
ws.setSupportZoom(true);// support zoom//ws.setDefaultZoom(WebSettings.ZoomDensity.FAR) ;ws.setBuiltInZoomControls(true); //page auto adapterws.setUseWideViewPort(true);ws.setLoadWithOverviewMode(true);
2、页内跳转
WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url。
mWebView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) { //重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边 view.loadUrl(url); return true;}
3、加载进度
//此方法可以处理webview 在加载时和加载完成时一些操作mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { if(newProgress==100){ // 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作 title.setText(“加载完成”); }else{ title.setText(“加载中…….”); } }});
4、错误处理
5、获取网站图标
参考stackoverflow.
//先在onCreate()方法里设置icon存储的路径WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath()); //再设置webview的WebChromeClientmWebView.setWebChromeClient(new MyWebChromeClient()); //最后MyWebChromeClient中重写以下方法@Overridepublic void onReceivedIcon(WebView view, Bitmap icon) { if(icon != null ){mIconImgeView.setImageBitmap(icon);}}
6、处理back键
如果用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;}
7、使用缓存
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");
二、难点重点
1、长按处理
/** * 处理长按弹出的上下文菜单事件,包括网页链接,图片链接等... */class Hao123ContextMenuListener implements OnCreateContextMenuListener{@Overridepublic 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() {@Overridepublic boolean onMenuItemClick(MenuItem item) { // TODO 各菜单项事件处理 }}; }
2、播放flash
1、判断是否安装了flash,若没有跳转到市场安装 http://blog.csdn.net/zircon_1973/article/details/8067041
2、代码里设置支持flash播放
WebSettings ws = mWebView.getSettings();ws.setJavaScriptEnabled(true) ;ws.setPluginsEnabled(true); //Flash supportif(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" ....... >
3、实现点击下载
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); }});
4、cookie保存
http://blog.csdn.net/jdsjlzx/article/details/7761333
5、支持视频播放
可以参考这个项目
6、处理JS事件
三、疑难杂症
1、空白底部
垂直滚动条总是显示白色轨迹底图(无法消掉) 在xml中给WebView设置一下属性发觉不起一点作用:
android:fadeScrollbars = "true"android:scrollbarStyle = "outsideOverlay"android:scrollbarAlwaysDrawVerticalTrack = "false"
必须在代码中对WebView进行设置才能奏效:
webview .setScrollbarFadingEnabled( true );webview .setScrollBarStyle(View. SCROLLBARS_INSIDE_OVERLAY );
2、Uncaught TypeError
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);
四、webkit剖析
1、http://mogoweb.net/categories/webkit-research
- webview 属性以及整体介绍
- WebView的简单使用以及属性介绍
- 关于webview与H5属性设置以及交互的总结
- webView的基本属性设置以及遇到的一些坑
- Android webview 写入cookie的解决方法以及一些属性设置
- webview功能介绍,以及利用缓存节省流量
- WebView介绍
- webview介绍
- webView介绍
- ExtJS Store 方法以及属性介绍
- ExtJS Store 方法以及属性介绍
- CCNode的属性以及方法的介绍
- ios_oc @property和@synthesize以及属性介绍
- CSS介绍以及常用属性总结
- sp业务整体介绍
- ACM/ICPC整体介绍
- GIS 整体框架介绍
- SQLSERVER 之整体介绍
- JavaScript权威指南_47_第6章_对象_6.10-对象方法
- python快速学习笔记
- windows下python protobuf 安装
- 铁道部新客票系统的设计。
- 如何用多个字符串来切分字符串
- webview 属性以及整体介绍
- Android -animation-Property Animation
- Netty SSL开发
- Reverse Words in a String
- 每日一题:求数组中出现次数超过一半的元素
- 织梦网站巧用标签实现图片自动Alt功能,强化织梦seo效果
- 学习C++——类的自动转换和强制类型转换
- Android studio 1.0 多渠道打包
- POJ 2299 Ultra-QuickSort