WebView基本演绎法(1)

博客地址:http://blog.csdn.net/yang786654260
英文API:http://developer.android.com/reference/android/webkit/WebView.html

权限

WebView是一个展示网页的控件,因此需要联网的权限,在清单文件中添加权限:

<uses-permission android:name="android.permission.INTERNET" />

基本使用方法

默认情况下,WiewView不支持JavaScript 和忽视网页中的错误。如果你知识想在你的部分UI里展示一个页面,用户不与页面交互,页面也不用反响用户,这样很容易实现。如果你想展示一个成熟的页面,那么最好调用浏览器应用来展示页面:

 Uri uri = Uri.parse("http://blog.csdn.net/yang786654260");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);

在你的Activity中展示WebView可以在你的layout中包含< WebView >元素:

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>

加载控件,打开页面

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("http://blog.csdn.net/yang786654260");

或者在onCreate()中把整个活动窗口设置为WebView:

 WebView webview = new WebView(this);
 setContentView(webview);

 // Simplest usage: note that an exception will NOT be thrown
 // if there is an error loading this page (see below).
 webview.loadUrl("http://blog.csdn.net/yang786654260");

 // OR, you can also load from an HTML string:
 String summary = "<html><body>You scored <b>192</b> points.</body></html>";
 webview.loadData(summary, "text/html", null);
 // ... although note that there are restrictions on what this HTML can do.
 // See the JavaDocs for loadData() and loadDataWithBaseURL() for more info.

在WebView中使用JavaScript

开启JavaScript的功能

如下使用到WebSettings

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

在Android代码中绑定JavaScript代码

有时候你需要在你的Android的WebView中设置些特殊功能,你可以创建一些借口来实现,例如你可以在Android代码中调用一个方法来展示Dialog来代替JavaScript的alert()。

你可以使用如下方法,来在JavaScript中调用类:

public void addJavascriptInterface (Object object, String name)
class JsObject {
    @JavascriptInterface
    public String toString() { return "injectedObject"; }
 }
 webView.addJavascriptInterface(new JsObject(), "injectedObject");
 webView.loadData("", "text/html", null);
 webView.loadUrl("javascript:alert(injectedObject.toString())");

下面有另一个例子:

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }
}

警告:如果你设置targetSdkVersion为17或更高版本,你必须为任何一个对JavaScript有效的方法添加@JavascriptInterface注释,该方法必须是public,否则该方法不会对你的页面有效。

在这个例子中,WebAppInterface类允许web页面使用showToast()方法创建一个吐丝消息。然后你可以将这个类运行在WebView中,并把接口命名为“Android”:

WebView webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new WebAppInterface(this), "Android");

然后你可以在JavaScript如下使用:

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" />

<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }
</script>

处理页面导航

当你点击WebView页面中的一个链接,默认情况下是Android启用一个处理URL的应用程序。你可以在你的WebView中覆盖这个行为:在你的WebView中打开这个链接,你可以允许使用者通过保存在WebView中的历史进行导航后退或前进。

使用WebViewCilent重载shouldOverrideUrlLoading()方法:

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("blog.csdn.net")) {
            // 这是自己的网站,所以不覆盖;让WebView加载页面
            return false;
        }
        // 否则,如果不是自己站点的链接, 启动另一个Activity来处理url
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
}

然后如下设置:

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new MyWebViewClient());

当你点击链接的时候,系统会调用 shouldOverrideUrlLoading()检查URL host是否匹配特定的域名。不匹配就会加载一个默认的应用来处理URL。

浏览网页的历史

当你的WebView重写URL加载,WebView会自动累积记录历史页面,你可以使用goBack()和goForward()向后和向前导航历史。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

注意:你必须要执行canGoBack()或canGoForward()检查。

HTML5 Video support

打开硬件加速,设置WbChromeClient,全屏支持,继承 onShowCustomView(View, WebChromeClient.CustomViewCallback),需要onHideCustomView()getVideoLoadingProgressView()是可选的。

深入理解请看:
Migrating to WebView in Android 4.4 | Android Developers
http://developer.android.com/guide/webapps/migrating.html

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值