Android WebView组件用法详解

时间:2022-04-23 07:04:57

本文实例讲述了android webview组件用法。分享给大家供大家参考,具体如下:
如果想webview能够访问网络,必须在androidmanifest.xml里面添加权限

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

main.xml很简单,就是一个webview

?
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >
  <webview
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</linearlayout>

webviewdemoactivity.java代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.tianjf;
import android.app.activity;
import android.os.bundle;
import android.webkit.webview;
public class webviewdemoactivity extends activity {
  private webview mwebview;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    mwebview = (webview) findviewbyid(r.id.webview);
    // 得到websettings对象,设置支持javascript参数
    // 如果访问的页面中有javascript,则webview必须设置支持javascript ,否则显示空白页面
    mwebview.getsettings().setjavascriptenabled(true);
    // 加载url
    mwebview.loadurl("http://www.baidu.com/");
  }
}

运行一下就会看到url被正确load出来了。

但是有个问题,当点击链接继续浏览,则会弹出系统默认的browser,为了能够继续在webview中浏览,要用到shouldoverrideurlloading方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@override
public void oncreate(bundle savedinstancestate) {
  。。。。。。。。。。。。。。。。。。。。。。。。
  // 虽然google主页在webview中显示了,但是如果点击链接继续浏览,则会显示到系统默认的browser中
  // 为了继续在webview中显示,需要重写shouldoverrideurlloading方法
  mwebview.setwebviewclient(new mywebviewclient());
  。。。。。。。。。。。。。。。。。。。。。。。。
    }
private class mywebviewclient extends webviewclient {
  @override
  public boolean shouldoverrideurlloading(webview view, string url) {
    view.loadurl(url);
    return true;
  }
}

另外,如果想按回退键回到上一个页面,那么

?
1
2
3
4
5
6
7
8
9
10
11
/**
 * 按back键可以回到上个网页
 */
@override
public boolean onkeydown(int keycode, keyevent event) {
  if ((keycode == keyevent.keycode_back) && mwebview.cangoback()) {
    mwebview.goback();
    return true;
  }
  return super.onkeydown(keycode, event);
}

对于android 2.0开始又多出了一种新的方法,对于activity 可以单独获取back键的按下事件,直接重写onbackpressed 方法即可,代码如下

?
1
2
3
4
5
@override
public void onbackpressed() {
 // 这里处理逻辑代码,该方法仅适用于2.0或更高版本的sdk
return ;
}

如果想加载工程中的html,那么可以用到下面的方法(前提是html放在assets目录中)

?
1
mwebview.loadurl("file:///android_asset/test.html");

如果想直接load一段html文,可以用下面的方法

?
1
mwebview.loaddata("<html><body>abcdefg</body></html>", "text/html", "utf-8");

下面是webview其他的一下用法:

设置允许访问文件数据

?
1
mwebview.getsettings().setallowfileaccess(true);

设置支持缩放

?
1
mwebview.getsettings().setbuiltinzoomcontrols(true);

设置是否保存密码

?
1
mwebview.getsettings().setsavepassword(false);

设置支持各种不同的设备

复制代码 代码如下:
mwebview.getsettings().setuseragentstring("mozilla/5.0 (ipad; u; cpu os 3_2 like mac os x;en-us) applewebkit/531.21.10 (khtml, like gecko) version/4.0.4 mobile/7b334bsafari/531.21.10");

 

加载webview网页时所要执行的一些方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mwebview.setwebviewclient(new webviewclient() {
    // 新开页面时用自己定义的webview来显示,不用系统自带的浏览器来显示
    @override
    public boolean shouldoverrideurlloading(webview view, string url) {
      view.loadurl(url);
      return true;
    }
    // 开始加载网页时要做的工作
    @override
    public void onpagestarted(webview view, string url, bitmap favicon) {
      super.onpagestarted(view, url, favicon);
    }
    // 加载完成时要做的工作
    @override
    public void onpagefinished(webview view, string url) {
      super.onpagefinished(view, url);
    }
    // 加载错误时要做的工作
    @override
    public void onreceivederror(webview view, int errorcode,
        string description, string failingurl) {
      super.onreceivederror(view, errorcode, description, failingurl);
    }
});

处理网页中的一些对话框信息(提示对话框,带选择的对话框,带输入的对话框)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
mwebview.setwebchromeclient(new webchromeclient() {
    // 提示对话框
    @override
    public boolean onjsalert(webview view, string url, string message,
        final jsresult result) {
      // 构建一个builder来显示网页中的alert对话框
      builder builder = new builder(webviewdemoactivity.this);
      builder.settitle("提示对话框");
      builder.setmessage(message);
      builder.setpositivebutton(android.r.string.ok,
          new alertdialog.onclicklistener() {
            @override
            public void onclick(dialoginterface dialog,
                int which) {
              result.confirm();
            }
          });
      builder.setcancelable(false);
      builder.create();
      builder.show();
      return true;
    }
    // 带按钮的对话框
    @override
    public boolean onjsconfirm(webview view, string url,
        string message, final jsresult result) {
      builder builder = new builder(webviewdemoactivity.this);
      builder.settitle("带选择的对话框");
      builder.setmessage(message);
      builder.setpositivebutton(android.r.string.ok,
          new alertdialog.onclicklistener() {
            @override
            public void onclick(dialoginterface dialog,
                int which) {
              result.confirm();
            }
          });
      builder.setneutralbutton(android.r.string.cancel,
          new alertdialog.onclicklistener() {
            @override
            public void onclick(dialoginterface dialog,
                int which) {
              result.cancel();
            }
          });
      builder.setcancelable(false);
      builder.create();
      builder.show();
      return true;
    }
    // 带输入框的对话框
    @override
    public boolean onjsprompt(webview view, string url, string message,
        string defaultvalue, final jspromptresult result) {
      layoutinflater inflater = layoutinflater
          .from(webviewdemoactivity.this);
      final view v = inflater.inflate(r.layout.mydialog, null);
      // 设置 textview对应网页中的提示信息
      ((textview) v.findviewbyid(r.id.textview)).settext(message);
      // 设置edittext对应网页中的输入框
      ((edittext) v.findviewbyid(r.id.edittext))
          .settext(defaultvalue);
      builder builder = new builder(webviewdemoactivity.this);
      builder.settitle("带输入的对话框");
      builder.setview(v);
      builder.setpositivebutton(android.r.string.ok,
          new alertdialog.onclicklistener() {
            @override
            public void onclick(dialoginterface dialog,
                int which) {
              string value = ((edittext) v
                  .findviewbyid(r.id.edittext)).gettext()
                  .tostring();
              result.confirm(value);
            }
          });
      builder.setnegativebutton(android.r.string.cancel,
          new alertdialog.onclicklistener() {
            @override
            public void onclick(dialoginterface dialog,
                int which) {
              result.cancel();
            }
          });
      builder.setoncancellistener(new dialoginterface.oncancellistener() {
        @override
        public void oncancel(dialoginterface dialog) {
          result.cancel();
        }
      });
      builder.create();
      builder.show();
      return true;
    }
    // 设置网页加载的进度条
    @override
    public void onprogresschanged(webview view, int newprogress) {
      webviewdemoactivity.this.getwindow().setfeatureint(
          window.feature_progress, newprogress * 100);
      super.onprogresschanged(view, newprogress);
    }
    // 设置应用程序的标题
    @override
    public void onreceivedtitle(webview view, string title) {
      webviewdemoactivity.this.settitle(title);
      super.onreceivedtitle(view, title);
    }
});

希望本文所述对大家android程序设计有所帮助。