一、用WebView处理页面导航

可以加载本地资源也可以加载web资源,区别是我们要加载本地资源要实现在assets文件夹里添加一个.html资源。调取网页的时候可以用loadUrl方法把网址添加进去也可以用Intent意图,把Uri地址添加进去就好了,在这里我就不写不来了。但是在打开的时候总是默认通过第三方浏览器或者系统自带浏览器打开网页,下面这段代码就是解决这个问题的,使得网页在webView中打开。

webView.setWebViewClient(new WebViewClient(){

@Override

public boolean shouldOverrideUrlLoading(WebView view, String url) {

// 返回true的时候控制网页在WebView中打开

//返回false的时候是调用系统浏览器或者第三方浏览器打开

view.loadUrl(url);

return true;

}

});

二、在WebView中使用JavaScript

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

WebSettings webSettings=webView.getSettings();

webSettings.setJavaScriptEnabled(true);

三、解决WebView前进与后退的问题

       当我们一级一级的打开网页的时候,我们按Back键的时候并不是一级一级返回的,而是整个WebView都退出来了,这样的用户体验是非常差的。为了解决这个问题,我们需要自动生成历史访问记录,生成历史返回记录的前提是要WebView覆盖Url的加载,覆盖之后就可以通过 goBack()或者goForward()向前或向后访问已经访问过的站点。代码如下:

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode==KeyEvent.KEYCODE_BACK) {

//判断网页是否能返回

if (webView.canGoBack()) {

webView.goBack();

return true;

}else {

System.exit(0);

}

}

return super.onKeyDown(keyCode, event);

}

四、判断页面的加载过程

      我们在打开一个网页的时候,由于有些网页加载的缓慢,在加载出来网页之前,界面的一片空白的,影响用户体验。所以我们需要去判断页面的加载过程,制作进度条给用户良好的体验效果。代码实现如下:

webView.setWebChromeClient(new WebChromeClient() {

@Override

// newProgress是1-100之间的整数

public void onProgressChanged(WebView view, int newProgress) {

super.onProgressChanged(view, newProgress);

// 网页加载完成

if (newProgress == 100) {

// 关闭加载完毕,关闭ProgressDialog

closeDialog();

} else {

// 网页正在加载,打开ProgressDialog

openDialog(newProgress);

}

}

private void openDialog(int newProgress) {

if (dialog == null) {

dialog = new ProgressDialog(Test.this);

dialog.setTitle("正在加载");

dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

dialog.setProgress(newProgress);

dialog.show();

} else {

dialog.setProgress(newProgress);

}

}

protected void closeDialog() {

if (dialog != null && dialog.isShowing()) {

dialog.dismiss();

dialog = null;

}

}

});

五、WebView缓存的应用

      上边的方法是给用户一种错觉,网页正在加载要耐心的等一会儿,这并不是最好的解决办法,所以需要给WebView添加缓存,WebView默认情况是没有带缓存的。代码实现如下:

WebSettings settings=webView.getSettings();

settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

缓存资源在File Explorer——>data——>data——>当前项目文件夹——>cache目录下

六、WebView一些基本设置

1、是否支持JavaScript

webView.getSettings().setJavaScriptEnabled(false);

2、是否支持缩放,默认为true

webView.getSettings().setSupportZoom(false);

3、设置是否显示缩放工具,默认为false

webView.getSettings().setBuiltInZoomControls(false);

4、一般很少会用到这个,用WebView组件显示普通网页时一般会出现横向滚动条,这样会导致页面查看起来非常不方便。LayoutAlgorithm是一个枚举,用来控制html的布局,总共有三种类型:NORMAL:正常显示,没有渲染变化。SINGLE_COLUMN:把所有内容放到WebView组件等宽的一列中。NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。

          webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);

5、设置默认的字体大小,默认为16,有效值区间在1-72之间

webView.setDefaultFontSize(20);

七、加载内容的三种方式

       除了上面提到的可以加载assets目录下的本地网页和远程网页,还可以使用 LoadData 或者 loadDataWithBaseURL方法加载内容,在这里我说一说第三种。

有时候我们的webview可能只是html片段,而不是一个完整的网页,事实上绝大多数时候都是这样的。这种情况我们使用 LoadData 或者 loadDataWithBaseURL方法。

void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)

void loadData (String data, String mimeType, String encoding)

   String body ="<img src='/uploads/allimg/130923/1FP02V7-0.png' />";
   webView.loadDataWithBaseURL("http://www.jcodecraeer.com", body, "text/html", "utf-8",null);

六、WevView访问网络权限

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

WebView使用详解的更多相关文章

  1. Android WebView 开发详解

    Android WebView 开发详解 参见 http://blog.csdn.net/typename/article/details/39030091

  2. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  3. Android WebView 开发详解(三)

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

  4. Android WebView 开发详解(二)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by miechal zhao   概览: Androi ...

  5. Android WebView 开发详解(一)

    转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...

  6. Android webview使用详解

    1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){ @Override public bo ...

  7. WebView使用详解(一)——Native与JS相互调用(附JadX反编译)

    念念不忘,必有回响,永远坚持你所坚持的! 一直在用WebView,还没有系统的总结过它的用法,下面就系统的总结下,分享给大家 一.基本用法 1.加载在线URL void loadUrl(String ...

  8. Android中的WebView实战详解(一)

    一.为什么要用WebView? 1.兼容已有的项目2.可动态更新 二.WebView怎样使用? WebView是一个控件,如在布局中设置: <WebView android:id="@ ...

  9. Android中的WebView实战详解(二)

    四.如何用WebView下载软件? 四.如何用WebView下载软件? public class MainActivity extends AppCompatActivity { private We ...

随机推荐

  1. APUE学习之---------------进程

    离职了,交接期也有足够的时间了,可以在好好的再看一下APUE,想想上次详细的看还是在两年之前,虽然中间也偶尔会翻出来看看,但是由于工作上交集相对比较少一直没有去细读一下.现在正好是一段空挡期可以好好看 ...

  2. Flex 自定义事件

    一.分派自定义事件类型 任何实现flash.event.IEventDispatcher接口的对象都可以分派事件,这包括所有显示对象和一些非显示对象类.通常,对于 自定义的非显示类,可以通过扩展fla ...

  3. 20140603 对error.c 用于分析源代码

    20140603 对error.c 用于分析源代码 继续看error.c该功能 买家现在将自己的代码和数据汇编例如,下面的:   1.#include <stdio.h>   2 #inc ...

  4. uva311 - Packets(贪心)

    题目:311 - Packets 题目大意:给出1*1, 2*2,3 *3, 4*4, 5*5, 6*6的箱子的个数,如今有若干个6*6的箱子,问最少用多少个箱子能够将给定的箱子都装进去. 解题思路: ...

  5. C#主键类型选择

    1.SQL Server中两种常用的主键数据类型:int(或者bigint)+标识列(又称自动增长字段) uniqueidentifier(又称Guid.UUID) 2.Guid算法是一种可以产生唯一 ...

  6. cocos2d-x学习资源汇总(持续更新。。。)

    引用地址:http://www.cnblogs.com/zilongshanren/archive/2012/02/17/2356516.html 我之前一直学习c++的,第一次接触cocos2d是o ...

  7. vmware能够ping通内网,上不了外网的解决方法

    一般这是由于里面的路由域名服务器没有配置好. issta@ubuntu:~$ ping www.baidu.com ping: unknown host www.baidu.com 先看一下地址解析器 ...

  8. Visual Studio shortcut keys

    VS2010 快捷键   Ctrl+E,D ----格式化全部代码  Ctrl+E,F ----格式化选中的代码  CTRL + SHIFT + B生成解决方案  CTRL + F7 生成编译  CT ...

  9. TabSpec和TabHost实例

    TabSpec与TabHost TabHost相当于浏览器中浏览器分布的集合,而Tabspec则相当于浏览器中的每一个分页面.d在Android中,每一个TabSpec分布可以是一个组件,也可以是一个 ...

  10. 基于visual Studio2013解决C语言竞赛题之0307函数求值

      题目 解决代码及点评 这又是个条件函数,但是这个函数无法用switch来解决,因为switch只能用于和某条件相等情况下,而这个函数的范围是无穷的 遇到这种问题,我们还是需要用复合的if语 ...