• 安卓开发笔记——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>
  • 相关阅读:
    java 读取ini文件
    JPA简单的分页条件查询
    工厂模式之简单工厂模式,head first设计模式
    mvnw 找不到或无法加载主类,找不到符号,类
    spring boot 通过feign调用api接口
    Ubuntu18.04 samba配置
    log4cplus例子
    ES->PES->PS打包程序
    RED5安装与配置
    Java 常用的日志工具——JDK自带的java.util.logging包、APACHE 的log4j 与 slf4j日志处理接口
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3959345.html
Copyright © 2020-2023  润新知