Android WebView学习笔记

来源:互联网 发布:淘宝有访客无询单 编辑:程序博客网 时间:2024/03/29 09:47

先看一下WebView的继承关系:

WebView
extends AbsoluteLayout
implements ViewTreeObserver.OnGlobalFocusChangeListener ViewGroup.OnHierarchyChangeListener

java.lang.Object
  ↳ android.view.View
    ↳ android.view.ViewGroup
      ↳ android.widget.AbsoluteLayout
        ↳ android.webkit.WebView

  • 必须添加权限:<uses-permission android:name="android.permission.INTERNET" />
  • 缺省情况下,WebView不提供类似浏览器的一些控件,不启动JavaScript,忽略网页的错误。如果你仅仅想给用户显示一个网页,不需要用户去交互,那么WebView这个控件也许挺好。但如果你确实需要成熟的web浏览器功能,那你最好通过URL Intent启动系统浏览器程序,而不是WebView。例如:
 Uri uri = Uri.parse("http://www.example.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);

WebView的几个定制点:
  • 创建并设置一个WebChromeClient 子类。辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等。例如:onJsAlert、onProgressChanged等。
  • 创建并设置一个WebViewClient 子类。辅助WebView渲染内容,例如onPageStarted、onPageFinished、处理错误信息以及重新提交表单。你还可以通过shouldOverrideUrlLoading() 拦截URL载入。
  • 更改Web设置(WebSettings)。例如通过setJavaScriptEnabled()启用JavaScript。
  • 通过addJavascriptInterface(Object, String) 向WebView中注入Java对象。这样网页中的JavaScript上下文就能操作该对象了。
这有个稍微复杂点的例子,展示出错信息,设置,进度提示:
// Let's display the progress in the activity title bar, like the // browser app does. getWindow().requestFeature(Window.FEATURE_PROGRESS); webview.getSettings().setJavaScriptEnabled(true); final Activity activity = this; webview.setWebChromeClient(new WebChromeClient() {   public void onProgressChanged(WebView view, int progress) {     // Activities and WebViews measure progress with different scales.     // The progress meter will automatically disappear when we reach 100%     activity.setProgress(progress * 1000);   } }); webview.setWebViewClient(new WebViewClient() {   public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {     Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();   } }); webview.loadUrl("http://developer.android.com/");


        Android将所有的实际密度归为三个广义的密度high, medium, and low。Android缩放网页以适应不同分辨率的屏幕,所以高密度屏幕缩放1.5倍而低密度缩放0.75倍。Android2.0开始就支持DOM, CSS, and meta tag功能了,这样就好控制分辨率问题了。
        Android还支持HTML5 Video。但需要打开硬件加速并设置WebChromeClient。
几个常用的方法:
void addJavascriptInterface(Object object, String name)
    Injects the supplied Java object into this WebView.向WebView中注入Java对象。
    object:the Java object to inject into this WebView's JavaScript context. Null values are ignored.要注入WebView中的Java对象。
    name:the name used to expose the object in JavaScript。暴露给javaScript所需的名字。
boolean canGoBack()
    Gets whether this WebView has a back history item.该WebView是否有回退的历史条目
boolean canGoBackOrForward(int steps)
    Gets whether the page can go back or forward the given number of steps.该页面手否能回退或前进steps步。
boolean canGoForward()
    Gets whether this WebView has a forward history item.该WebView是否有前进的历史条目。
void clearHistory()
    Tells this WebView to clear its internal back/forward list.通知WebView清除它的回退/前进历史列表
void clearView()
    This method was deprecated in API level 18. Use WebView.loadUrl("about:blank") to reliably reset the view state and release page resources (including any running JavaScript).API18以上摒弃该方法,用WebView.loadUrl("about:blank") 来可靠地重置view状态并释放页面资源。
void documentHasImages(Message response)
    Queries the document to see if it contains any image references.查询文档,看它是否包含图片引用。
static String findAddress(String addr)
    Gets the first substring consisting of the address of a physical location.获取第一个包含物理地址的子串
int findAll(String find)
    This method was deprecated in API level 16. findAllAsync(String) is preferred.API16以上摒弃该方法,偏爱findAllAsync(String)
void findAllAsync(String find)
    Finds all instances of find on the page and highlights them, asynchronously.异步找到页面实例并高亮显示它们。
int getContentHeight()
    Gets the height of the HTML content.获取HTML内容的高。
Bitmap getFavicon()
    Gets the favicon for the current page.获取当前页面的图标。
void loadData(String data, String mimeType, String encoding)
    Loads the given data into this WebView using a 'data' scheme URL.通过data模式的URL将data数据以WebView格式显示出来。
void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)
    Loads the given data into this WebView, using baseUrl as the base URL for the content.将给定数据加载到这个WebView。使用baseUrl作为该内容的初始URL。
void loadUrl(String url)
    Loads the given URL.通过url定位符载入网页。
void loadUrl(String url, Map<String, String> additionalHttpHeaders)
    Loads the given URL with the specified additional HTTP headers.载入被指定额外HTTP报头(包括controlling caching, accept types or the User-Agent)的url网页。
常量:

public static final String SCHEME_GEO
    URI scheme for map address.地理坐标
    Constant Value: "geo:0,0?q="

public static final String SCHEME_MAILTO
    URI scheme for email address.邮件地址
    Constant Value: "mailto:"

public static final String SCHEME_TEL
    URI scheme for telephone number.电话号码
    Constant Value: "tel:"

WebView使用的一些小技巧:

①内嵌网页,而不是打开系统浏览器。

mWebView.setWebViewClient(new WebViewClient(){      @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {          view.loadUrl(url); return true;      }});

②按返回键时, 不退出程序而是返回上一浏览页面。

public boolean onKeyDown(int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView .canGoBack()) {webview.goBack();return true;}return super.onKeyDown(keyCode, event);}
③用户需要输入时,必须获取焦点。

webview.requestFocusFromTouch();

④其它控制。

// 设置可以支持缩放 web.getSettings().setSupportZoom(true); // 设置出现缩放工具 web.getSettings().setBuiltInZoomControls(true);//扩大比例的缩放web.getSettings().setUseWideViewPort(true);//自适应屏幕web.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);web.getSettings().setLoadWithOverviewMode(true);


例子:
public class MainActivity extends Activity {WebView wv_notice;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wv_notice = (WebView) this.findViewById(R.id.wv_notice);wv_notice.getSettings().setJavaScriptEnabled(true);wv_notice.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// TODO Auto-generated method stubview.loadUrl(url);return true;}@Overridepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {// TODO Auto-generated method stubsuper.onReceivedError(view, errorCode, description, failingUrl);//Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();}});StringBuffer sb = new StringBuffer("<html><head><title>通知公告</title></head>");sb.append("<body>我是body我是body我是body我是body我是body我是body我是body我是body我是body我是body我是body<br>").append("<img src=\"http://img03.3dmgame.com/uploads/allimg/141115/271_141115025804_1_lit.jpg\"/>").append("</body></html>");wv_notice.loadDataWithBaseURL(null, sb.toString(), "text/html", "utf-8", null);}@Override  public boolean onKeyDown(int keyCode, KeyEvent event) {      if ((keyCode == KeyEvent.KEYCODE_BACK) && wv_notice.canGoBack()) {      wv_notice.goBack();        return true;    }    return super.onKeyDown(keyCode, event);  }  }





0 0
原创粉丝点击