Chendd's Blog

世界上没有什么事情是一行代码不能解决的。如果有,那就两行。

Android学习日记15--WebView(网络视图)

一、WebView

1、简述

       WebView(网络视图)内置WebKit引擎,能加载显示网页,还支持JS,并且能够在Android平台使用AJAX WebView可以在布局中声明,也可以在Activity中直接实例化

2、主要步骤

       使用WebView 的主要步骤:

  • 1.在布局文件中声明WebView,通过findViewById或在Activity中实例化WebView组件:WebView webView = new WebView(this);
  • 2.调用WebView的loadUrl()方法,设置WevView要显示的网页: 互联网用:webView.loadUrl(“http://www.google.com”); 本地文件用:webView.loadUrl(“file:///android_asset/Todos.html”); 本地文件存放在:assets 文件中
  • 3.调用Activity的setContentView( )方法来显示网页视图
  • 4.用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面
  • 5.需要在AndroidManifest.xml文件中添加权限,否则会出现Web page not available错误。

3、实例演示

Activity代码:

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
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.activity_main);
        wv = (WebView) findViewById(R.id.wv);
        wv.setWebChromeClient(new WebChromeClient() { // 为WebView设置WebChromeClient
            @Override
            public void onProgressChanged(WebView view, int newProgress) {// 重写onProgressChanged方法
                MainActivity.this.setProgress(newProgress * 100);
            }
        });
        wv.setWebViewClient(new WebViewClient() { // 为WebView设置WebViewClient
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {// 重写onReceivedError方法
                Toast.makeText(MainActivity.this, "Sorry!" + description,
                        Toast.LENGTH_SHORT).show();
            }
        });
        Button btn = (Button) findViewById(R.id.btn); // 获取Button对象
        btn.setOnClickListener(new View.OnClickListener() { // 为Button对象设置OnClickListener监听器
            @Override
            public void onClick(View v) {

                EditText et = (EditText) findViewById(R.id.et); // 获得WebView对象
                String url = et.getText().toString().trim();
                if (URLUtil.isNetworkUrl(url)) { // 判断是否是网址
                    wv.loadUrl(url);
                } else {
                    Toast.makeText(MainActivity.this, "对不起,您输入的网址有错。",
                            Toast.LENGTH_SHORT).show();
                    et.requestFocus(); // 将焦点移到EditText
                }
            }
        });
        // 设置前进后退按钮
        Button btnForward = (Button) findViewById(R.id.btnForward);
        btnForward.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (wv.canGoForward()) { // 判断是否能够前进
                    wv.goForward();
                } else {
                    Toast.makeText(MainActivity.this, "对不起,您现在不能前进!",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
        Button btnBack = (Button) findViewById(R.id.btnBack);
        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (wv.canGoBack()) { // 判断是否能够前进
                    wv.goBack();
                } else {
                    Toast.makeText(MainActivity.this, "对不起,您现在不能后退!",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

       第一次输入网址运行报错:

image

       原因是没有在AndroidManifest配置权限,加入权限:

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

再次输入博客园首页网址点击'浏览':

image

       竟然出现一张美女图片,无意中发现个彩蛋,网址输成http://www.cnblog.com/ ,漏了个s

重新输入网址浏览:

image

上面有个进度条显示网页加载进度,多输入几个网址测试'前进','后退'的功能。再输入本地文件测试,显示以前写的待办事项网页

image

       注意:在输入本地文件网址时,代码要把判断是否是网址URLUtil.isNetworkUrl(url)去掉,因为不会识别file:///为网址

1
2
3
4
5
6
7
if (URLUtil.isNetworkUrl(url)) { // 判断是否是网址
  wv.loadUrl(url);
} else {
    Toast.makeText(MainActivity.this, "对不起,您输入的网址有错。",
            Toast.LENGTH_SHORT).show();
    et.requestFocus(); // 将焦点移到EditText
}

Comments