android-webview

作者: 六便士少年 | 来源:发表于2015-04-18 19:43 被阅读915次

    1.1 Android WebView 一些基本概念

    开发过程中应该注意:
    1.AndroidManifest.xml 中必须使用许可android.permission.INTERNET.否则会出Web page not available错误
    2.如果访问的页面中有javascript,则WebView必须设置支持javascript
    WebView.setSettings().setJavaScriptEnable(true);
    3.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖webView的WebViewClient对象
    wv1.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // TODO Auto-generated method stub view.loadUrl(url); return true; } });
    4.如果不做任何处理,浏览网页,点击系统back键,整个browser会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件
    @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if ((keyCode == KeyEvent.KEYCODE_BACK) && wv1.canGoBack()) { wv1.goBack(); return true; } return super.onKeyDown(keyCode, event); }

    下面来了解一下android中webView是如何支持javascript自定义对象的,在w3c标准中js有window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了。
    看一个实例

    public class MainActivity extends Activity { private WebView wv1; private Handler mHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); wv1 = (WebView) findViewById(R.id.wv); WebSettings webSettings = wv1.getSettings(); webSettings.setJavaScriptEnabled(true); wv1.addJavascriptInterface(new Object() { public void clickOnAndroid() { mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub wv1.loadUrl("javascript: wave()"); } }); } }, "demo"); wv1.loadUrl("file:///android_asset/demo.html"); } }
    在assets目录下加入demo.html文件
    <html> <mce: script language="javascript"> </mce: script> <body> <a onClick="window.demo.clickOnAndroid()"> <img id="droid" src="ic_launcher.png" mce_src="ic_launcher.png"/><br> Click me! </a> </body> </html>
    效果:

    Paste_Image.png

    我们来看看addJavascriptInterface(Object object, String name)这个方法

    Paste_Image.png

    该方法将一个Java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global,这样初始化后,在WebView加载的页面中就可以通过javascript:window.demo访问到绑定的java对象了

    javascript中就可以调用java对象的clickOnAndroid()方法了,同样,我们可以在此对象中定义很多方法,

    注意:

    1.为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为“file://android_asset/",WebView遇到这样 的schema就去当前包中的assets目录中找内存

    2.addJavascriptInterface方法中要绑定的java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用handler的目的。

    1.2 Android WebView 组件的使用详情

    网络内容

    • loadUrl 直接显示网页内容(单独显示网络图片)
    • loadData 显示中文网页内容(含空格的处理)
      APK 包含文件
    • LoadUrl显示APK中Html和图片文件
    • LoadData(loadDataWithBaseURL)显示APK中图片和文字混合的Html内容

    package com.example.demo2; import java.net.URLEncoder; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; @SuppressLint("JavascriptInterface") public class MainActivity extends Activity { final String mimeType = "text/html"; final String encoding = "utf-8"; WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = (WebView) findViewById(R.id.wv); webView.getSettings().setJavaScriptEnabled(true); webHtml(); webImage(); localHtmlZh(); localHtmlBlankSpace(); localHtmlImage(); }

     /***
     * 显示本地图片和文字混合的html内容
     */
    private void localHtmlImage() {
        // TODO Auto-generated method stub
        try {
            String data = "测试本地图片和文字混合显示,这是APK里的图片";
            // SDK1.5本地文件处理(不能显示图片)
            // webView.loadData(URLEncoder.encode(data, encoding), mimeType,
            // encoding);
            // SDK1.6及以后版本
            webView.loadData(data, mimeType, encoding);
            // 本地文件处理(能显示图片)
            webView.loadDataWithBaseURL("about: blank", data, mimeType,
                    encoding, "");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    /**
     * 中文显示(空格的处理)
     */
    private void localHtmlBlankSpace() {
        // TODO Auto-generated method stub
        try {
            String data = "测试含有空格的Html数据";
            webView.loadData(URLEncoder.encode(data, encoding), mimeType,
                    encoding);
            webView.loadData(data, mimeType, encoding);
            webView.loadData(
                    URLEncoder.encode(data, encoding).replaceAll("+", " "),
                    mimeType, encoding);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    /**
     * 中文显示
     */
    private void localHtmlZh() {
        // TODO Auto-generated method stub
        try {
            String data = "测试含有中文的html数据";
            // WebView.loadData(data, mimeType, encoding);
            webView.loadData(URLEncoder.encode(data, encoding), mimeType,
                    encoding);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }   
    /**
     * 直接网络图片显示
     */
    private void webImage() {
        // TODO Auto-generated method stub
        try {
      webView.loadUrl("http://h.hiphotos.baidu.com/image/w%3D230/sign=648d06b8a41ea8d38a227307a70b30cf/38dbb6fd5266d0165e532f2b952bd40735fa356e.jpg");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    /*
     * 直接显示网页
     */
    private void webHtml() {
        // TODO Auto-generated method stub
        try {
            webView.loadUrl("http://www.baidu.com");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
      }   
    }
    

    2.1 Android编写简单的WebView

    相关文章

      网友评论

      • Future魏来:如何在外部Activity中处理在内部Fragment中的webView的返回事件呢?
        c263ae2147d8:把fragment中的webview设置成静态,然后在Activity中的onkeydown方法中判读,应该可以。

      本文标题:android-webview

      本文链接:https://www.haomeiwen.com/subject/qhoefttx.html