欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中的WebView详细介绍

程序员文章站 2023-02-02 11:30:50
android中webview的详细解释: 1. 概念: webview(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了webkit渲染引擎加载显示网页。...

android中webview的详细解释:

1. 概念:

webview(网络视图)能加载显示网页,可以将其视为一个浏览器。它使用了webkit渲染引擎加载显示网页。

2. 使用方法:

(1).实例化webview组件:
a.在activity中实例化webview组件。eg:

复制代码 代码如下:

   webview webview = new webview(this);

b.调用webview的loadurl()方法,设置wevview要显示的网页.eg:
复制代码 代码如下:

互联网用:webview.loadurl("http://www.google.com");
本地文件用:webview.loadurl("file:///android_asset/xx.html");
本地文件存放在:assets 文件中

c.调用activity的setcontentview( )方法来显示网页视图。
d.需要在androidmanifest.xml文件中添加权限,否则会出现web page not available错误。

复制代码 代码如下:

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

 (2).自定义webview组件继承webviewclient:
a.在布局文件中声明webview。eg:

复制代码 代码如下:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <webview
            android:id="@+id/webview1"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </linearlayout>


b.在activity中实例化webview。
c.调用webview的loadurl()方法,设置webview要显示的网页.
d.调用setwebviewclient()方法设置webview视图。响应链接功能。
e.需要在androidmanifest.xml文件中添加权限,否则出现web page not available错误。
复制代码 代码如下:

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

 3. 两种方法的区别:
(1).第一种方法:点击链接是新开android的系统browser中响应该链接。
(2).第二种方法:点击链接由自己处理,而不是新开android的系统browser中响应该链接。给webview添加一个事件监听对象(webviewclient)并重写其中的shouldoverrideurlloading方法:对网页中超链接按钮的响应。当按下某个连接时webviewclient会调用这个方法,并传递参数:按下的url。

4. 总结:
(1). 用webview点链接看了很多页以后为了让webview支持回退功能,需要覆盖覆盖activity类的onkeydown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面。

复制代码 代码如下:

@override
   public boolean onkeydown(int keycode, keyevent event) {
       if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) {
       // goback()表示返回webview的上一页面
           mwebview.goback();
           return true;
       }
       return super.onkeydown(keycode, event);
   }

(2). 设置webview基本信息:

a.如果访问的页面中有javascript,则webview必须设置支持javascript。

复制代码 代码如下:

webview.getsettings().setjavascriptenabled(true); 

b.触摸焦点起作用:
复制代码 代码如下:

 requestfocus();

c.取消滚动条:
复制代码 代码如下:

this.setscrollbarstyle(scrollbars_outside_overlay);

5. 整体代码如下:
(1).mainactivity.java

package com.pansoft.webviewdemo;

import android.annotation.suppresslint;
import android.app.activity;
import android.os.bundle;
import android.view.keyevent;
import android.view.window;
import android.webkit.websettings;
import android.webkit.webview;

import com.pansoft.webviewdemo.webview.mywebview;

public class mainactivity extends activity {
    private webview mwebview = null;
    private websettings msettings = null;
    /** tag */
    private string tag = getclass().getsimplename();
    /** url */
    private string flg_url = "http://www.baidu.com/";
    private mywebview mywebview;

    @suppresslint("setjavascriptenabled")
    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        requestwindowfeature(window.feature_no_title);

        // 第二种方法
        init01();
        // 第一种方法
        // init02();

    }

    /**
     * 加载的是webview本身的
     */
    private void init01() {
        setcontentview(r.layout.activity_main);
        mwebview =(webview)findviewbyid(r.id.webview1);
        msettings = mwebview.getsettings();
        // webview设置支持javascript
        msettings.setjavascriptenabled(true);
        // 加载url
        mwebview.loadurl(flg_url);
        mywebview = new mywebview(this, mwebview);
        mwebview.setwebviewclient(mywebview);

    }

    /**
     * 加载的是系统自带的浏览器
     */
    private void init02() {
        mwebview = new webview(this);
        msettings = mwebview.getsettings();
        msettings.setjavascriptenabled(true);
        mwebview.loadurl(flg_url);
        setcontentview(mwebview);

    }

    @override
    public void onbackpressed() {
        super.onbackpressed();
    }

    @override
    public boolean onkeydown(int keycode, keyevent event) {
        if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) {
        // goback()表示返回webview的上一页面
            mwebview.goback();
            return true;
        }
        return super.onkeydown(keycode, event);
    }

}

(2).mywebview.java

package com.pansoft.webviewdemo.webview;

import android.content.context;
import android.graphics.bitmap;
import android.util.log;
import android.webkit.httpauthhandler;
import android.webkit.webview;
import android.webkit.webviewclient;

/**
 * mywebview
 *
 * @author administrator
 *
 */
public class mywebview extends webviewclient {
    private context mcontext;
    private webview mwebview;
    private string tag = getclass().getsimplename();

    /**
     * 构造方法
     *
     * @param mcontext
     * @param mwebview
     */
    public mywebview(context mcontext, webview mwebview) {
        super();
        this.mcontext = mcontext;
        this.mwebview = mwebview;
    }

    /**
     * 打开链接前的事件,为了避免再次按的时候加载的是系统自带的浏览器,点击链接由自己处理
     */
    // 这个函数我们可以做很多操作,比如我们读取到某些特殊的url,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。
    @override
    public boolean shouldoverrideurlloading(webview view, string url) {
        if (url != null) {
            mwebview.loadurl(url);
            log.d(tag, "--->shouldoverrideurlloading--->");

        }

        return true;
    }

    /**
     * 接收到http请求的事件
     */
    @override
    public void onreceivedhttpauthrequest(webview view,

    httpauthhandler handler, string host, string realm) {
        super.onreceivedhttpauthrequest(view, handler, host, realm);
    }

    /**
     * 载入页面开始的事件
     */
    // 这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。
    @override
    public void onpagestarted(webview view, string url, bitmap favicon) {
        super.onpagestarted(view, url, favicon);
        log.d(tag, "--->onpagestarted--->");
    }

    /**
     * 载入页面完成的事件
     */
    // 同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切换程序动作。
    @override
    public void onpagefinished(webview view, string url) {
        super.onpagefinished(view, url);
        log.d(tag, "--->onpagefinished--->");
    }

    /**
     * 当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。
     */
    @override
    public void onreceivederror(webview view, int errorcode,
            string description, string failingurl) {
        super.onreceivederror(view, errorcode, description, failingurl);
    }

}

(3).activity_main.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <webview
        android:id="@+id/webview1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</linearlayout>

(4).权限:

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