Android WebView详解与优化

本文详述了Android WebView的使用,包括通过意图、Asstes目录下的HTML文件及URL地址访问互联网的方法。在使用WebView和URL时,需要在Manifest清单文件中添加相应权限。在布局文件中添加WebView控件后,可通过访问Asstes目录下的HTML文件间接实现互联网访问。对于Android Studio项目,需要手动创建Asstes目录。示例代码展示了如何用WebView加载HTML以访问百度网站。

本文是对WebView控件的使用详解,涉及到应用访问互联网的几种方式.如通过意图,通过Asstes目录下的HTML文件,URL地址等等.开文须强调的是,我们通过意图和Asstes目录下的HTML文件访问互联网时,是不需要配置Manifest清单文件的, 而通过WebView和URL访问则需在清单文件中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.webview">

    <!--允许应用访问互联网-->
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

布局文件非常简单,只需拖一个WebView控件即可,如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.webview.MainActivity">


    <WebView
        android:id="@+id/WebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="13dp"
        android:layout_marginStart="13dp"
        android:layout_marginTop="15dp" />

</RelativeLayout>

前面提到通过访问Asstes目录下的HTML文件访问互联, 也就是说Asstes目录下可存放一个标准的HTML文件, 里面的HTML标签有访问互联网的功能,如设置A标签的Href属性. 那么我们可以通过访问HTML文件来达到间接访问互联网的目的,但是对于Android Studio的工程来说,并没有Asstes目录,需我们手动创建, 选中工程下面的main目录 右键 new–>Directory 取名为asstes

这里写图片描述

这里写图片描述

a.html是一行标准的HTML代码,我们可以通过它来访问百度(不知道为什么A标签里面显示中文会乱码 , Android Studio 是utf-8格式)

通过java代码实现应用访问互联网,WebView详解如下:

package com.webview;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    //声明WebView控件
    private WebView webView;
    //声明对话框控件
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.WebView);

        /* 通过意图访问互联网
        String url = "http://blog.youkuaiyun.com/li1996heng";
        Uri uir = Uri.parse(url);
        Intent intent = new Intent(Intent.ACTION_VIEW, uir);
        startActivity(intent);*/

        //通过asstes目录下的HTML文件访问互联网
        webView.loadUrl("file:///android_asset/a.html");

        //通过URL地址访问互联网(需要在Manifest中做访问互联网的配置)
        webView.loadUrl("http://blog.youkuaiyun.com/li1996heng");

        // 以上所有访问互联网的方式都是通过系统自带浏览器或第三方浏览器


        // 以下代码是设置通过WebView访问互联网
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl("http://blog.youkuaiyun.com/li1996heng");
                //返回值为TRUE才会通过WebView访问互联网
                return true;
            }
        });

        //启用支持JavaScript脚本
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);

        //启用WebView的缓存机制,提升浏览速度(缺点是缓存文件会占用内存)
        // settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

        /**
         * 在某些时候,比如网速很差,那么用户通过WebView访问互联网会特别慢
         * 为了增加用户体验度,此时我们可以要告诉用户他的等待还需要多久
         * 可以通过进度条的方式实现这一逻辑
         * setWebChromeClient这个类onProgressChanged()方法用于判断网页的加载进度,
         * 参数newProgress的值在1--100之间  100表示网页加载完毕
         */
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                //如果网页加载完毕,关闭进度条对话框
                if (newProgress == 100) {
                    closeDialog();
                } else {
                    //如果网页正在加载,打开进度条对话框
                    openDialog(newProgress);
                }

            }

            //打开进度条对话框的方法
            private void openDialog(int newProgress) {
                //如果进度条对话框不存在
                if (progressDialog == null) {
                    //实例化一个进度条对话框
                    progressDialog = new ProgressDialog(MainActivity.this);
                    //设置进度条对话框的样式为水平样式
                    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                    //设置标题
                    progressDialog.setTitle("正在加载");
                    //把参数newProgress的值传给进度条对话框
                    progressDialog.setProgress(newProgress);
                    //显示对话框
                    progressDialog.show();
                } else {
                    //如果存在直接把newProgress的值传给对话框
                    progressDialog.setProgress(newProgress);
                }

            }

            //关闭进度条对话框的方法
            private void closeDialog() {
                //当进度条对话框不为空并且正在显示的时候
                if (progressDialog != null && progressDialog.isShowing()) {
                    //关闭对话框并置为空
                    progressDialog.dismiss();
                    progressDialog = null;
                }
            }

        });

    }

    /**
     * 通过WebView访问互联网的时候,返回键并不是返回上次一浏览页面
     * 而是退出程序, 为增加用户体验 须改写返回按键的逻辑
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //如果点击了返回键
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            //如果页面存在可返回的页面
            if (webView.canGoBack()) {
                //返回上一页面
                webView.goBack();
                return true;
            } else {
                //没有就退出程序
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值