安卓开发复习笔记——WebView组件

我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了

准备随笔记录些复习笔记,也当做温故知新吧~

1、什么是WebView?

WebView(网络视图)能加载显示网页,可以将其视为一个浏览器,它使用了WebKit渲染引擎加载显示网页。

废话不多说,直接上代码

1、需要在xml布局文件中声明WebView组件

1     <WebView
2         android:id="@+id/webview"
3         android:layout_width="fill_parent"
4         android:layout_height="fill_parent"
5         />

2、在Activity中实例化WebView,并且可通过loadUrl(url)方法打开指定url资源

1     private WebView webView;
2     private String url = "http://www.baidu.com";
3     webView = (WebView) findViewById(R.id.webview);// 获取控件
4     webView.loadUrl(url);// 载入指定url(调用系统自带浏览器)

这里的url可以是网络上的资源,也可以是本地文件

例如:

网络上的资源:webView.loadUrl("http://www.google.com");
本地文件:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放在:assets 文件中

用这种方式打开的资源是依赖于系统自带的浏览器,而不是WebView组件,若想用自身WebView组件去实现,需要我们去调用setWebViewClient()方法

在实现类中需要去复写一个shouldOverrideUrlLoading()方法,具体看下面代码注释

 1         webView.setWebViewClient(new WebViewClient() {
 2             /**
 3              * 重写shouldOverrideUrlLoading,返回值若为true将用webview,false则是系统自身浏览器
 4              */
 5             @Override
 6             public boolean shouldOverrideUrlLoading(WebView view, String url) {
 7                 view.loadUrl(url);
 8                 return true;
 9             }
10         });

这样子,我们可以实现不依靠系统自带浏览器打开我们的url资源,但这里会出现一个问题,只要我们一点手机上的返回键,整个程序就直接退出了。

我们想要的应该是和浏览器一样的效果,按下返回键应该还是向后退一步,回到之前浏览的网页,而不是直接退出程序。

解决方法,我们只需要去监听物理返回键并做出对应的逻辑出来就行

 1     @Override
 2     public boolean onKeyDown(int keyCode, KeyEvent event) {// keyCode代表按键的数字标示符
 3         if (keyCode == KeyEvent.KEYCODE_BACK) {
 4             if (webView.canGoBack()) {
 5                 webView.goBack();
 6                 return true;
 7             } else {
 8                 System.exit(0);
 9             }
10         }
11
12         return super.onKeyDown(keyCode, event);
13     }

3、由于不是用Intent去调用系统组件,所以我们需要对程序进行权限的允许,在AndroidManifest.xml里对程序开放Inter权限

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

以上就是基本的WebView使用方法,当然WebView还有很多属性可以去设置,只要我们去实例化出webSettings类的对象,就可以对它"为所欲为"了

例如:

1         WebSettings webSettings = webView.getSettings();// 获取配置信息
2         webSettings.setJavaScriptEnabled(true);// 是否允许加载js文件
3         webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 打开缓存

到这里有些朋友可能会问,这样做出的效果,好像感觉打开url资源的时候有点卡顿,很不舒服的一种感觉

我们可以适当添加点友好型的交互,比如打开网页时有个进度条加载等,这里额外说下关于WebViewClient和WebChromeClient两个类

(此处摘录于《程序之路》)

WebViewClient主要帮助WebView处理各种通知、请求事件的,比如:

onLoadResource
onPageStart(页面前置操作)
onPageFinish(页面后置操作)
onReceiveError
onReceivedHttpAuthRequest

WebChromeClient主要辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等比如:

onCloseWindow(关闭WebView)

onCreateWindow()

onJsAlert (WebView上alert无效,需要定制WebChromeClient处理弹出)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle

看上去他们有很多不同,实际使用的话,如果你的WebView只是用来处理一些html的页面内容,只用WebViewClient就行了,如果需要更丰富的处理效果,比如JS、进度条等,就要用到WebChromeClient。

最后上一个完整的Demo演示:

先来看下效果图:

  

  

MainActivity.java

 1 package com.example.webview;
 2
 3 import android.app.Activity;
 4 import android.app.ProgressDialog;
 5 import android.os.Bundle;
 6 import android.view.KeyEvent;
 7 import android.webkit.WebChromeClient;
 8 import android.webkit.WebSettings;
 9 import android.webkit.WebView;
10 import android.webkit.WebViewClient;
11
12 public class MainActivity extends Activity {
13
14     private WebView webView;
15     private String url = "http://www.baidu.com";
16     private ProgressDialog progressDialog;
17
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         initWebView();
23     }
24
25     private void initWebView() {
26         webView = (WebView) findViewById(R.id.webview);// 获取控件
27         webView.loadUrl(url);// 载入指定url(系统自带浏览器,若想用自身webview需要重写方法,提供client)
28         WebSettings webSettings = webView.getSettings();// 获取配置信息
29         webSettings.setJavaScriptEnabled(true);// 是否允许加载js文件
30         webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 打开缓存
31         webView.setWebViewClient(new WebViewClient() {
32             /**
33              * 重写shouldOverrideUrlLoading,返回值若为true则用webview,false则是系统自身浏览器
34              */
35             @Override
36             public boolean shouldOverrideUrlLoading(WebView view, String url) {
37                 view.loadUrl(url);
38                 return true;
39             }
40         });
41
42         webView.setWebChromeClient(new WebChromeClient() {
43             @Override
44             public void onProgressChanged(WebView view, int newProgress) {// newProgress当前进度
45                 if (newProgress == 100) {
46                     // 加载完毕,关闭进度条
47                     closeProgressDialog();
48                 } else {
49                     //加载未完成,显示进度
50                     showProgressDialog(newProgress);
51                 }
52                 super.onProgressChanged(view, newProgress);
53             }
54
55             private void closeProgressDialog() {
56                 progressDialog.dismiss();
57                 progressDialog=null;
58
59             }
60
61             private void showProgressDialog(int newProgress) {
62                 if (progressDialog == null) {
63                     progressDialog = new ProgressDialog(MainActivity.this);
64
65                     progressDialog.setTitle("页面正在加载中..请稍后");
66                     progressDialog
67                             .setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条样式
68                     progressDialog.setProgress(newProgress);//设置进度
69                     progressDialog.show();
70                 } else {
71                     progressDialog.setProgress(newProgress);
72                     progressDialog.show();
73                 }
74
75             }
76         });
77
78     }
79
80     @Override
81     public boolean onKeyDown(int keyCode, KeyEvent event) {// keyCode代表按键的数字标示符
82         if (keyCode == KeyEvent.KEYCODE_BACK) {
83             if (webView.canGoBack()) {
84                 webView.goBack();
85                 return true;
86             } else {
87                 System.exit(0);
88             }
89         }
90
91         return super.onKeyDown(keyCode, event);
92     }
93
94 }

activity_main.xml

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.example.webview.MainActivity" >
10
11     <WebView
12         android:id="@+id/webview"
13         android:layout_width="fill_parent"
14         android:layout_height="fill_parent"
15         />
16
17 </RelativeLayout>

AndroidManifest.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.webview"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="21" />
10     <uses-permission android:name="android.permission.INTERNET"/>
11
12     <application
13         android:allowBackup="true"
14         android:icon="@drawable/ic_launcher"
15         android:label="@string/app_name"
16         android:theme="@style/AppTheme" >
17         <activity
18             android:name=".MainActivity"
19             android:label="@string/app_name" >
20             <intent-filter>
21                 <action android:name="android.intent.action.MAIN" />
22
23                 <category android:name="android.intent.category.LAUNCHER" />
24             </intent-filter>
25         </activity>
26     </application>
27
28 </manifest>
时间: 2024-08-05 13:31:39

安卓开发复习笔记——WebView组件的相关文章

安卓开发复习笔记——TabHost组件(实现底部菜单导航)

安卓开发复习笔记——TabHost组件(实现底部菜单导航) 4 来源:cnblog    阅读:1048   时间:2014-09-16 什么是TabHost? TabHost组件的主要功能是可以进行应用程序分类管理,例如:在用户使用windows操作系统的时候,经常见到如图所示的图形界面. TabHost选项卡,说到这个组件,不得不先说一件事情,翻翻谷歌提供给我们的API,我们可以发现这样的一段话: 它告诉我们,这个组件在安卓4.0之后已经被废弃了,建议我们新的程序应该使用Fragment组件

安卓开发复习笔记——ViewPager组件(仿微信引导界面&gt;)

这2天事情比较多,都没时间更新博客,趁周末,继续继续~ 今天来讲个比较新潮的组件——ViewPager 什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v4.jar这个包的支持,这是一个来自google提供的一个附加包. 通俗点来讲,就是现在市面上大多数app,安装完第一次打开软件会出现的一个左右滑动的引导界面. 先来看下效果图:     这是一个

安卓开发复习笔记——GridView组件

1.什么是GridView? GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的. 2.正文 GridView的用法很多,网上介绍最多的方法就是自己实现一个ImageAdapter继承BaseAdapter,再供GridView使用,太多的东西我就不再重复去写,这次记录点不一样的用法. 先看下效果图:(点击应用图标以Toast的方式显示信息) 首先先说下GridView常用的XML属性: 属性名称 描述

安卓开发复习笔记——Gallery组件+ImageSwitcher组件

什么是Gallery? Gallery是一个水平的列表选择框,它允许用户通过拖动来查看上一个.下一个列表选项. 下图是今天要实现的最终效果: 利用Gallery组件实现的一个横向显示图像列表,可以通过左.右滑动屏幕来切换图像,并加上ImageSwitcher实现一个大图片预览功能. 1.一步一步来吧,首先先解决下上半部分(图像导航) 先来看下效果图,下图是利用Gallery组件实现的一个横向显示图像列表,可以通过左.右滑动屏幕来切换图像.   直接上代码,注释很全. MainActivity.j

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面

安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)

什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Activity中,我们可以合并多个Fragment在一个单独的activity中建立多个UI面板,或

安卓开发复习笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)

菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu).上下文菜单(ContextMenu)和子菜单(SubMenu). 菜单的实现方式有2种:一种是通过布局文件xml生成菜单,另一种是通过代码生成. 三种菜单内容有点多,不过大体相似,一次性讲完吧,本人偏好代码动态生成,下面就以代码为例. 1.选项菜单(OptionsMenu) 先来看下选项菜单的效果图:   在一个Activity界面中点击手机Menu键,在屏幕下方弹出的菜单

IOS开发复习笔记(3)-ARC

1.ARC 当你自己调用了release或retain语句的时候,ARC有效时编译文件会遇到错误,你可以通过-fno-objc-arc和-fobjc-arc两个编译器标志在混搭中支持ARC和非ARC的代码 如下面编译支持ARC,而文件代码不支持ARC # if !__has_feature(objc_arc) //this code do not support to ARC -(void) release{ //release your var } #endif 在ARC工程中集成非ARC的第

安卓开发入门笔记#1 初认Activity

一.Activity基本概念 Activity是安卓开发中的重要组件,它为用户提供了基本的屏幕交互空间.简单来说,我们直观看到的应用可操作界面,其基础就是托管的activity. 一个应用通常由多个activity组成,一个activity可以启动另外一个acitvity,新的activity称为子activity,其父activity将会自动停止,并被压入stack,当子activity返回时,再从stack中弹出父activity. 二.Activity的生命周期 安卓官方文档有句话:开发一