Adnroid打造通用的带进度条的WebView

在Android开发中,经常需要加载显示网页,一般一个页面在打开后,在等待数据加载的过程中,都需要花一点时间,这个时候往往需要显示一个转动的进度条(ProgressBar),接下来封装了一个自定义控件和加载网页的公共Activity,方便使用。
一般的做法是在layout.xml中添加ProgressBar,但我们不这样做,主要是为了减少layout嵌套。
按照惯例我们先来看看最终的效果图:

在调用的时候很简单,就只需要传递一个url(加载网页的url)和title(显示标题)就可以了,如下所示:

Intent intent = new Intent(MainActivity.this, MainWebViewActivity.class);
  intent.putExtra("url", "http://blog.csdn.net/qq_20785431");
  intent.putExtra("title", "我的博客");
  startActivity(intent);

1.接下来主要还是看看重写的带加载条的webview

package com.per.loadingwebviewdome;

import android.content.Context;
import android.os.Environment;
import android.util.AttributeSet;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

/**
 * @author: xiaolijuan
 * @description: 带加载条的webview
 * @date: 2016-06-03
 * @time: 23:34
 */
public class LoadingWebView extends WebView {

 private ProgressBar mProgressBar;
 /**
  * 网页缓存目录
  */
 private static final String cacheDirPath = Environment
   .getExternalStorageDirectory() + "/LoadingWebViewDome/webCache/";

 public LoadingWebView(Context context) {
  super(context, null);
 }

 public LoadingWebView(Context context, AttributeSet attrs) {
  super(context, attrs, 0);
 }

 public LoadingWebView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  initContext(context);
 }

 private void initContext(Context context) {
  requestFocus();
  setInitialScale(39);
  getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//支持通过Javascript打开新窗口
  getSettings().setJavaScriptEnabled(true);//设置WebView属性,能够执行Javascript脚本
  getSettings().setUseWideViewPort(true);//将图片调整到适合webview的大小
  getSettings().setLoadWithOverviewMode(true);// 缩放至屏幕的大小
  getSettings().setDomStorageEnabled(true);//设置是否启用了DOM Storage API
  getSettings().setDatabaseEnabled(true);//开启database storage API功能
  getSettings().setDatabasePath(cacheDirPath); //设置数据库缓存路径
  getSettings().setAppCachePath(cacheDirPath);//设置Application Caches缓存目录
  getSettings().setAppCacheEnabled(true);//开启Application Caches功能
 }

 /**
  * 加载网页url
  *
  * @param url
  */
 public void loadMessageUrl(String url) {
  super.loadUrl(url);
  setWebViewClient(new WebViewClient() {
   public boolean shouldOverrideUrlLoading(WebView view, String url) { // 重写此方法表明点击网页里面的链接不调用系统浏览器,而是在本WebView中显示
    loadUrl(url);//加载需要显示的网页
    return true;
   }
  });
 }

 /**
  * 添加进度条
  */
 public void addProgressBar() {
  mProgressBar = new ProgressBar(getContext(), null,
    android.R.attr.progressBarStyleHorizontal);
  mProgressBar.setLayoutParams(new LayoutParams(
    LayoutParams.MATCH_PARENT, 5, 0, 0));
  mProgressBar.setProgressDrawable(getContext().getResources()
    .getDrawable(R.drawable.bg_pb_web_loading));
  addView(mProgressBar);//添加进度条至LoadingWebView中

  setWebChromeClient(new WebChromeClient());//设置setWebChromeClient对象
 }

 public class WebChromeClient extends android.webkit.WebChromeClient {
  @Override
  public void onProgressChanged(WebView view, int newProgress) {
   if (newProgress == 100) {
    mProgressBar.setVisibility(GONE);
   } else {
    if (mProgressBar.getVisibility() == GONE)
     mProgressBar.setVisibility(VISIBLE);
    mProgressBar.setProgress(newProgress);
   }
   super.onProgressChanged(view, newProgress);
  }
 }

 /**
  * 回收webview
  */
 public void destroyWebView() {
  clearCache(true);
  clearHistory();
 }
}

我们重写了3个构造方法,默认的布局文件调用的是两个参数的构造方法,所以记得让所有的构造调用我们的三个参数的构造,我们在三个参数的构造中获得自定义View的属性。

然后在布局中声明我们的自定义View

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <include layout="@layout/common_top_banner" />

 <com.per.loadingwebviewdome.LoadingWebView
  android:id="@+id/wv_loading"
  android:layout_width="match_parent"
  android:layout_height="match_parent" />

</LinearLayout>

2.下面就是通用的带进度条的WebView啦

package com.per.loadingwebviewdome;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * @author: xiaolijuan
 * @description: 通用的带进度条的WebView
 * @date: 2016-06-03
 * @time: 23:32
 */
public class MainWebViewActivity extends Activity implements View.OnClickListener {

 private ImageView mIvBack;
 private TextView mTvTitle;
 private LoadingWebView mLoadingWebView;

 private String mTitle = "";
 private String mUrl = "";

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_webview);
  initView();
  initData();
 }

 private void initView() {
  mIvBack = (ImageView) findViewById(R.id.iv_back);
  mLoadingWebView = (LoadingWebView) findViewById(R.id.wv_loading);
  mTvTitle = (TextView) findViewById(R.id.tv_title);

  mLoadingWebView.addProgressBar();
  mIvBack.setOnClickListener(this);
 }

 private void initData() {
  mTitle = getIntent().getStringExtra("title");
  mUrl = getIntent().getStringExtra("url");

  mLoadingWebView.loadMessageUrl(mUrl);
  mTvTitle.setText(mTitle);
 }

 @Override
 public void onDestroy() {
  super.onDestroy();
  mLoadingWebView.destroyWebView();
 }

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
   case R.id.iv_back:
    if (mLoadingWebView.canGoBack())
     mLoadingWebView.goBack();
    else {
     finish();
    }
    break;
  }
 }

 /**
  * 按返回键时, 不退出程序而是返回WebView的上一页面
  */
 @Override
 public void onBackPressed() {
  if (mLoadingWebView.canGoBack())
   mLoadingWebView.goBack();
  else {
   super.onBackPressed();
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Web Jmeter–接口测试工具详解

    关于Jmeter性能测试工具不再过多介绍.如果你要学习软件性能测试,那么多少应该会对它有所耳闻. 强烈建议阅读官方文档学习:http://jmeter.apache.org/index.html 还有比这个更权威更全面的介绍Jmeter工具使用的么? 不过,此处要介绍是用它来做接口测试. 一.安装Jmeter                      Jmeter官方首页:http://jmeter.apache.org/ 关于Jmeter可以做什么,官方上也有非常详细的介绍.另外它的文档也写很

  • 使用CORS实现JavaWeb跨域请求问题的方法

    之前用jsonp 解决跨域问题,现在用CORS实现跨域请求解决java 跨域问题: 主要代码如下 package com.hy.fliter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.

  • Python将图片批量从png格式转换至WebP格式

    实现效果 将位于/img目录下的1000张.png图片,转换成.webp格式,并存放于img_webp文件夹内. 源图片目录 目标图片目录 关于批量生成1000张图片,可以参考这篇文章:利用Python批量生成任意尺寸的图片 实现示例 import glob import os import threading from PIL import Image def create_image(infile, index): os.path.splitext(infile) im = Image.op

  • Web打印解决方案之普通报表打印功能

    做过很多的Web项目,大多数在打印页面内容的时候,采用的都是通过Javascript调用系统内置的打印方法进行打印,也就是调用PrintControl.ExecWB(?,?)实现直接打印和打印预览功能.打印的效果及控制性虽然不是很好,但是也能勉强使用,应付一般的打印还是可以的了. 代码如下所示: 代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->

  • javaWeb用户权限控制简单实现过程

    最近在做一个网站类型的项目,要对用户的访问模块(权限)进行控制,所以设计并实现了一套简单的权限控制功能. 1. 数据库设计  用户:users 模块:modules SQL代码: /* Target Server Type : MYSQL Target Server Version : 50628 File Encoding : 65001 Date: 2016-08-26 10:35:28 */ SET FOREIGN_KEY_CHECKS=0; -- --------------------

  • 在web中js实现类似excel的表格控件

    Execl功能非常强大,内置的很多函数或公式可以大大提高对数据的加工处理能力.那么在web中有没有类似的控件呢?经过一番搜寻,发现handsontable具备了基本的excel功能支持公式,同时能对数据进行实时编辑.另外支持拖动复制.Ctrl+C .Ctrl+V 等等.在浏览器支持方面,它支持以下的浏览器: IE7+, FF, Chrome, Safari, Opera. 首先引入相关库文件,公式支持不包含在handsontable.full.js中,需要单独引入: <script src=&quo

  • 深入学习JavaWeb中监听器(Listener)的使用方法

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换

  • 解决Golang在Web开发时前端莫名出现的空白换行

    问题: 在使用Golang做Web开发时,有时候渲染出来的模板在前台显示时会出现一些奇怪的空白换行,具体特征就是查看css样式表并没有相关定义的空白部分. 分析: 查看出现问题页面的网页源代码,复制空白换行部分转码为Unicode编码,发现其中包含了\u2028这样的字符[图一].  [图一] 另外,直接在浏览器检查里边的html选择Edit as html,也可发现在空白处存在小红点,鼠标移上会直接显示该字符是\u2028[图二].查阅资料发现,这样的换行符在JavaScript中并不支持.

  • 快速学习JavaWeb中监听器(Listener)的使用方法

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行. 1.2.监听器案例--监听window窗口的事件监听器 package me.gacl.listener.demo; import java.awt.Frame; imp

  • Adnroid打造通用的带进度条的WebView

    在Android开发中,经常需要加载显示网页,一般一个页面在打开后,在等待数据加载的过程中,都需要花一点时间,这个时候往往需要显示一个转动的进度条(ProgressBar),接下来封装了一个自定义控件和加载网页的公共Activity,方便使用. 一般的做法是在layout.xml中添加ProgressBar,但我们不这样做,主要是为了减少layout嵌套. 按照惯例我们先来看看最终的效果图: 在调用的时候很简单,就只需要传递一个url(加载网页的url)和title(显示标题)就可以了,如下所示

  • Android 带进度条的WebView 示例代码

    前言 如果不使用系统自带的TitleBar(即Activity被设置@android:style/Theme.NoTitleBar),那就需要自己来写进度条了,这里封装了一个自定义控件和加载网页的公共Activity,方便使用. 正文 一.截图 二.自定义控件 复制代码 /** * 带进度条的WebView * http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html * */ @SuppressWarnings("deprec

  • Android 实现带进度条的WebView的实例

    Android 实现带进度条的WebView的实例 1. WebView加载网页方法 //加载本地资源 loadUrl("file:///android_asset/example.html"); //加载网络资源 loadUrl("http://baidu.com"); 2. 带进度的Drawable文件view_progress_webview <?xml version="1.0" encoding="utf-8"

  • Android实现带进度条的WebView

    在加载H5页面的时候,可能由于网络.页面内容复杂度等原因,导致加载过程出现空白,加上进度条可以有效提高用户体验 一.自定义ProgressWebView类 public class ProgressWebView extends WebView { private ProgressBar progressbar; public ProgressWebView(Context context, AttributeSet attrs) { super(context, attrs); progres

  • Android中实现Webview顶部带进度条的方法

    写这篇文章,做份备忘,简单滴展示一个带进度条的Webview示例,进度条位于Webview上面. 示例图如下: 主Activity代码: 复制代码 代码如下: package com.droidyue.demo.webviewprogressbar; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.vi

  • Android实现文件解压带进度条功能

    解压的工具类 package com.example.videodemo.zip; public class ZipProgressUtil { /*** * 解压通用方法 * * @param zipFileString * 文件路径 * @param outPathString * 解压路径 * @param listener * 加压监听 */ public static void UnZipFile(final String zipFileString, final String out

  • jQuery上传多张图片带进度条样式(DEMO)

    下面一段代码给大家分享jquery上传多种图片带进度条样式,具体代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>xhr2</title> </head> <body> <div style="text-align: center; margin: 100px"> <

  • springMVC实现前台带进度条文件上传的示例代码

    项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用HTML5;截图前段模块是bootstarp框架;不废话直接来代码;spring-mvc配置文件;效果截图如下: 详细实现如下: 1.mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/s

  • asp.net mvc 实现文件上传带进度条的思路与方法

    前言 文件上传与下载的操作在实际项目中经常是很重要的一个内容,在使用ASP.NET Web Form的时候我们可以使用诸多的服务器控件,FileIpload就是其中之一,但是在ASP.NET不建议使用那些服务器控件,因为那样违反三层架构原则.最近参考网络资料,学习了ASP.NET MVC如何上传文件. 而这篇文章主要重点是asp.net mvc 实现文件上传带进度条,下面来一起看看吧. 实现思路 ajax异步上传文件,且开始上传文件的时候启动轮询来实时获取文件上传进度.保存进度我采用的是memc

  • asp.net单文件带进度条上传的解决方案

    最近做项目中遇到很多问题,比如带进度条的文件上传,看了网上很多资料还没找到真正意义上的ASP.NET实现进度条上传(可能是我没找到),下面我来跟大家分享一下我实现的这个程序. 首先看下界面效果,当然你可以完全修改界面为你自己所用. 先解释一下这个程序,该程序采用了jquery框架,实现了小文件上传,不超过80Mb,可以在web.config文件中进行相应的配置,但是有个最大值,具体需要查看msdn.开发环境采用visual studio 2013 .net framework 4.5,运行的时候

随机推荐