文档章节

【Android笔记】WebView的使用

大道无名
 大道无名
发布于 2016/09/28 22:24
字数 1116
阅读 57
收藏 4

1.加入WebView

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</WebView>

2.使用WebView加载页面

要用WebView加载页面,使用loadUrl()

1)加载本地文件:

webView.loadUrl("file:///android_asset/xx.html");
//本地文件存放在assets文件中

2)加载web资源

webView.loadUrl("http://www.baidu.com");

是页面获得焦点

webView.requestFocus();

3.获取网络访问权限

在AndroidManifest.xml文件中添加:

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

4.处理页面导航

  当用户点击一个WebView中的页面的链接时,通常是由默认的浏览器打开并加载目标URL的。然而,你可以在WebView中覆盖这一行为,那么链接就会在WebView中打开。

//WebView加载web资源
webView.loadUrl("http://www.baidu.com");

//覆盖webView默认通过第三方或者是系统浏览器打开网页的方法,使得网页可以在WebView中打开
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        //返回值是true的时候控制网页在WebView中去打开,如果为false则调用系统浏览器打开
        view.loadUrl(url);
        return true;
    }
});

5.在WebView中使用Javascript

    如果你想要加载在WebView中的web页面使用Javascript,你需要在WebView中启用Javascript。去哦用Javascript,你可以通过WebView中带有的WebView来启用它。你可以通过getSettings()来获取WebSettings的值,然后通过setJavaScriptEnabled()来启用Javascript。

//启用支持Javascript
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);

6.后退与前进

    当你的WebView覆盖了URL加载,它会自动生成历史访问记录,你可以通过goBack()或goForward()向前或向后访问已访问过的站点。

//改写物理按键返回的逻辑
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        if(webView.canGoBack()) { //如果WebView可以返回,则返回上一个页面
            webView.goBack();
            return true;
        } else {  //退出
            System.exit(0);
        }
    }
    return super.onKeyDown(keyCode, event);
}

7.页面加载过程进度条

    由于有些网页可能加载缓慢,所以我们需要去判断页面的加载过程,制作进度条给予用户良好的体验效果。

//在网页打开过程中添加一个进度条对话框
webView.setWebChromeClient(new WebChromeClient(){
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        //newProgress: 1~100之间的整数
        if(newProgress == 100) {  //网页加载完毕
            closeDialog();
        }else {  //网页正在加载,打开ProgressDialog
            openDialog(newProgress);
        }
    }
});



//关闭进度条对话框
private void closeDialog() {
    if(progressDialog != null && progressDialog.isShowing()) {
        progressDialog.dismiss();;
        progressDialog = null;
    }
}

//打开网页时显示进度条对话框
private void openDialog(int newProgress) {
    if(progressDialog == null) {
        progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setTitle("正在加载...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setProgress(newProgress);
        progressDialog.show();
    } else {
        progressDialog.setProgress(newProgress);
    }
}

8.WebView缓存的运用

使用缓存可以加快网页反应速度。

优先使用缓存:

WebSettings webSettings = webView.getSettings();
//WebView加载页面优先使用缓存加载
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

不使用缓存:

//不使用缓存
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

 

看一个实例:

1.新建一个项目,在activity_main.xml中添加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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.demo10.MainActivity">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </WebView>

</RelativeLayout>

2.在MainActivity.java中添加代码:

package com.example.demo10;

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

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    private ProgressDialog progressDialog;

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

        init();
    }

    private void init() {
        webView = (WebView) findViewById(R.id.webView);

        //WebView加载本地资源
        //webView.loadUrl("file:///android_asset/index.html");

        //WebView加载web资源
        webView.loadUrl("http://www.baidu.com");

        //覆盖webView默认通过第三方或者是系统浏览器打开网页的方法,使得网页可以在WebView中打开
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //返回值是true的时候控制网页在WebView中去打开,如果为false则调用系统浏览器打开
                view.loadUrl(url);
                return true;
            }
        });

        //启用支持Javascript
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        //WebView加载页面优先使用缓存加载
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);


        //在网页打开过程中添加一个进度条对话框
        webView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                //newProgress: 1~100之间的整数
                if(newProgress == 100) {  //网页加载完毕
                    closeDialog();
                }else {  //网页正在加载,打开ProgressDialog
                    openDialog(newProgress);
                }
            }
        });
    }

    //关闭进度条对话框
    private void closeDialog() {
        if(progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();;
            progressDialog = null;
        }
    }

    //打开网页时显示进度条对话框
    private void openDialog(int newProgress) {
        if(progressDialog == null) {
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("正在加载...");
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setProgress(newProgress);
            progressDialog.show();
        } else {
            progressDialog.setProgress(newProgress);
        }
    }

    //改写物理按键返回的逻辑
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            Toast.makeText(MainActivity.this, webView.getUrl(), Toast.LENGTH_SHORT).show();
            if(webView.canGoBack()) { //如果WebView可以返回,则返回上一个页面
                webView.goBack();
                return true;
            } else {  //退出
                System.exit(0);
            }
        }
        return super.onKeyDown(keyCode, event);
    }
}

运行效果:

 

© 著作权归作者所有

共有 人打赏支持
大道无名
粉丝 27
博文 161
码字总数 96019
作品 0
宣城
程序员
腾讯X5WebView集成2018-05-15

工作中经常偶尔会用到H5网页来加载页面,使用原生的Android的WebView可以加载,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久...

林灬
05/15
0
0
Android WebView:这是一份 详细 & 易懂的WebView学习攻略(含与JS交互、缓存构建等)

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho
05/21
0
0
Android WebView:这是一份全面 & 详细的WebView学习指南

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

carson_ho
04/19
0
0
Android Hybrid开发:这是一份详细 & 全面的WebView学习攻略

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho
06/19
0
0
当webview遇到了Slidingmenu,webView出现卡白,解决方案

Sliding Menu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作。如Evernote、Google+、Foursquare等诸多优秀应用都采用了这种界面方案。效...

来自猩猩的茶
2013/11/04
0
6

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之声明合并(一)

转发 TypeScript基础入门之声明合并(一) 声明合并 介绍 TypeScript中的一些独特概念描述了类型级别的JavaScript对象的形状。 TypeScript特别独特的一个例子是"声明合并"的概念。 在使用现有J...

durban
30分钟前
1
0
Mysql-db

aptitude install default-libmysqlclient-dev pip install mysql-python

dragon_tech
34分钟前
1
0
函数装饰器

def debug(func): def wrapper(*args, **kwargs): # 多个参数# def wrapper(something): # 指定一样的参数 print("[DEBUG]: enter {}()".format(func.__name__)) ......

colin_86
37分钟前
1
0
Notification-状态栏上的通知

当程序并不是出在运行状态的时候,可以调用Notification来显示通知。 1、创建 Notification的创建主要涉及到三个类:NotificationManager,Notification和PendingIntent NotificationManager主...

西米小娅
39分钟前
1
0
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource c

spring boot启动报错: Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determin......

wenzhizhon
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部