Android 内置浏览器之webview

来源:互联网 发布:linux 文件夹 组 编辑:程序博客网 时间:2024/05/22 22:05

目录:

        1.webview概述    
        2.webview常用方法
        3.webview基本使用
                3.1 真的基本使用(还有假的吗?白眼)
                3.2 cookie处理
                3.3 缓存处理
                3.4 页面导航处理
                3.5 缩放与窗口管理
        4.webview相关类介绍
                4.1 相关类思维导图
                4.2 webSettings
                4.3 WebViewClient
                4.4 WebChromeClient
        5.webview与javascript
        6.webview加载URL或本地网页

1.webview概述  

        webview是SDK中封装的一款基于webkit内核(后面开始基于Chromium内核)的浏览器组件,通过它我们可以实现网页的展示,实现某些实时性强的内容的更新,现在流行的混合型移动端其实最大一点好处就是可以实现热更新,webview其实也有那么一点意味在里面。
 

 2.webview常用方法

  1. //后退到上一页面
  2. webView.goBack();
  3. //前进到下一页面
  4. webView.goForward();
  5. //前进或者后退指定的页面数
  6. webView.goBackOrForward(2);
  7. //滑动到页面顶端
  8. webView.pageUp(true);
  9. //滑动到页面底端
  10. webView.pageDown(true);
  11. //以当前的页面为基准,判断是否webview的历史记录可以实现前进和后退指定的页数,正数向前,负数向后
  12. webView.canGoBackOrForward(-2);
  13. //判断webview的历史记录是否还可以实现回退
  14. webView.canGoBack();
  15. //判断webview的历史记录里面还可以实现向前
  16. webView.canGoForward();
  17. //清空网页的缓存数据,true表示全清空,false表示只清空内存资源缓存,不清空磁盘里面的
  18. webView.clearCache(true);
  19. //清除访问历史记录
  20. webView.clearHistory();
  21. //清空当前表单域中的表单数据
  22. webView.clearFormData();
  23. //加载指定网页
  24. webView.loadUrl("https://www.baidu.com");
  25. //获取当前页面的URL
  26. webView.getUrl();
  27. //重新加载当前的URL
  28. webView.reload();

 3.webview基本使用

3.1 真的基本使用(还有假的吗?白眼)
      我们先实现一个webview的简单使用,不添加任何添加剂,纯天然的webview~~~
(1)布局文件activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. android:paddingBottom="@dimen/activity_vertical_margin"
  11. tools:context="com.example.webview.MainActivity">
  12. <WebView
  13. android:id="@+id/webView"
  14. android:layout_width="match_parent"
  15. android:layout_height="match_parent">
  16. </WebView>
  17. </RelativeLayout>
(2)Java文件实现绑定并加载一个简单的网页
  1. package com.example.webview;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.webkit.WebView;
  5. public class MainActivity extends AppCompatActivity {
  6. private WebView webView;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. webView= (WebView) findViewById(R.id.webView);
  12. //加载指定网页
  13. webView.loadUrl("https://www.baidu.com");
  14. }
  15. }
(3)别忘了manifest.xml添加网络访问权限
  1. <!--添加网络访问权限-->
  2. <uses-permission android:name="android.permission.INTERNET"/>
ok,纯天然webview制作完成,看看效果


妈蛋,说好的内置呢,跟说好的不一样啊,为毛是调用系统的浏览器?好吧,看来的继续研究研究。
3.2 cookie处理
   (1)cookie概述
               在webview中设置cookie的主要作用是方便我们的native部分与我们的H5部分实现某些信息的同步,比如某个需要登录的应用,当你在native部分登录
但是某些操作需要在H5部分进行,这时候cookie同步就可以派上用场了。

    (2)cookie同步的实现
        (2.1)native部分从服务端获取发送给H5端,然后H5端通过ajax(异步JS和xml)接收,这里设计ajax交互我也不是很懂就不多做讲解

        (2.2)将本地的cookie数据直接同步到webview中
    webview的cookie保存在data/data/包名/databases/webviewCookiesChromium.db(我的Android模拟器版本是4.3的,之前的版本应该会有不一样)下面
当webview需要加载URL的时候就将这个数据库保存的对应的cookie同步上去,再与服务器交互的。

        (2.3)cookie同步类CookieManager/CookieSyncManager
  1. URL url=null;
  2. URLConnection conn= null;
  3. String cookie=null;
  4. try {
  5. url=new URL("http://www.baidu.com");
  6. //定义访问URLConnection请求
  7. conn = url.openConnection();
  8. //URLConnection获取响应头中的cookie信息
  9. cookie = conn.getHeaderField("Set-Cookie");
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. //httpClient获取cookie
  14. // List Cookies = httpClient.getCookieStore().getCookies();
  15. //判斷API版本是否小于21,小于21版本的需要CookieSyncManager来进行同步
  16. if (Build.VERSION.SDK_INT<Build.VERSION_CODES.LOLLIPOP){
  17. CookieSyncManager syncManager=CookieSyncManager.createInstance(this);
  18.  //更新cookie操作
  19.            //啓動同步,在更新cookie后同步时调用
  20. syncManager.sync();
  21. }
  22. //獲取有一个cookieManager实例
  23. CookieManager cookieManager = CookieManager.getInstance();
  24. //同步cookie setCookie(String url, String value)
  25. cookieManager.setCookie("http://www.baidu.com",cookie);
3.3 缓存处理
    (1)缓存的应用概述
            缓存的应用场景主要在一些需要频繁更新的的内容类APP,例如:资讯类,新闻类,阅读类,大多这类APP都有在没网的情况下阅读的需求
而缓存的应用恰好就在这里,它可以实现在有网的时候提前缓存你的网页内容,当你在没网的情况下,打开时它通过加载缓存中的内容展示给你,从
而实现离线缓存。

    (2)缓存分类
           

    (3)缓存处理的方式
  1. LOAD_CACHE_ONLY//不使用网络只读取本地缓存数据
  2. LOAD_DEFAULT//根据cache-control决定是否从网络获取
  3. LOAD_CACHE_NORMAL//API 17以后弃用
  4. LOAD_NO_CACHE//从网络获取
  5. LOAD_CACHE_ELSE_NETWORK//如果有本地缓存则从本地获取,如果没有则从网络获取

    (4)缓存与删除缓存案例
--1.MainActivity.java
  1. package com.example.webview;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.webkit.WebSettings;
  6. import android.webkit.WebView;
  7. import android.webkit.WebViewClient;
  8. import android.widget.Button;
  9. public class MainActivity extends AppCompatActivity {
  10. private WebView webView;
  11. private Button clearCacheBt;
  12. private static final String url="http://36kr.com/";
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. webView= (WebView) findViewById(R.id.webView);
  18. clearCacheBt= (Button) findViewById(R.id.clear_cache);
  19. //加载链接页面
  20. webView.loadUrl(url);
  21. //重写WebViewClient的shouldOverrideUrlLoading方法,实现在webview内加载网页
  22. final WebViewClient webViewClient = new WebViewClient(){
  23. @Override
  24. public boolean shouldOverrideUrlLoading(WebView view,String url){
  25. view.loadUrl(url);
  26. return true;
  27. }
  28. };
  29. webView.setWebViewClient(webViewClient);
  30. //获取WebSettings对象
  31. WebSettings settings=webView.getSettings();
  32. //设置支持js
  33. settings.setJavaScriptEnabled(true);
  34. //设置缓存使用方式为优先加载本地缓存
  35. settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
  36. //开启DOM存储API功能
  37. settings.setDomStorageEnabled(true);
  38. //开启数据库存储API功能
  39. settings.setDatabaseEnabled(true);
  40. //构造缓存路径
  41. String cacheDirPath=getFilesDir().getAbsolutePath()+"/webcache/";
  1. //设置数据库缓存路径
  2. settings.setAppCacheEnabled(true);
  3. settings.setAppCachePath(cacheDirPath);
  4. clearCacheBt.setOnClickListener(new View.OnClickListener() {
  5. @Override
  6. public void onClick(View v) {
  7. webView.clearCache(true);
  8. }
  9. });
  10. }
  11. @Override
  12. public void onBackPressed(){
  13. if (webView.canGoBack()){
  14. webView.goBack();
  15. }else {
  16. super.onBackPressed();
  17. }
  18. }
  19. }
--2.activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context="com.example.webview.MainActivity">
  8. <WebView
  9. android:id="@+id/webView"
  10. android:layout_width="match_parent"
  11. android:layout_weight="1"
  12. android:layout_height="0dp">
  13. </WebView>
  14. <LinearLayout
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content">
  17. <Button
  18. android:id="@+id/clear_cache"
  19. android:text="清除缓存"
  20. android:layout_width="match_parent"
  21. android:layout_height="wrap_content" />
  22. </LinearLayout>
  23. </LinearLayout>
-- 3.假巴意思截个图,前一个是访问后断开网路再次访问的结果,后一个是点击清除缓存后的结果
    


3.4 页面导航处理
        前面有列出webview中实现页面向前向后的方法,如下
  1. //后退到上一页面
  2. webView.goBack();
  3. //前进到下一页面
  4. webView.goForward();
  5. //前进或者后退指定的页面数
  6. webView.goBackOrForward(2);
  7. //滑动到页面顶端
  8. webView.pageUp(true);
  9. //滑动到页面底端
  10. webView.pageDown(true);
    但是webview并不是默认支持的,有时候如果我们不设置back键的效果,当我们按back键的时候,我们的webview浏览器会直接退掉,并不会达到我们想象的点击back键后,网页会回到我们浏览的页面的效果,要达到这样的效果我们需要设置一下,代码如下:
  1. /*
  2. * 重写按键操作处理方法
  3. * */
  4. @Override
  5. public boolean onKeyDown(int keyCode, KeyEvent event){
  6. //如果为按下back键操作并且webview能返回前一页,则设置返回
  7. if ((keyCode==KeyEvent.KEYCODE_BACK)&&webView.canGoBack()){
  8. webView.goBack();
  9. return true;
  10. }
  11. return super.onKeyDown(keyCode,event);
  12. }

3.5 缩放与窗口管理
   通常我们会有两种需求:1.加载页面可缩放;2.加载页面屏幕自适应且不可缩放 

1.加载页面可缩放
  1. //设置适应屏幕
  2. settings.setUseWideViewPort(true);
  3. settings.setLoadWithOverviewMode(true);
  4. //设置缩放
  5. settings.setSupportZoom(true);
  6. //显示缩放控件
  7. settings.setDisplayZoomControls(true);

2.加载页面屏幕自适应且不可缩放
    在加载的资源HTML页面中加入如下代码:
  1. <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">

4.webview相关类介绍

4.1 相关类思维导图

 4.2 webSettings
常用类简单总结:
  1. //获取WebSettings对象
  2. WebSettings settings=webView.getSettings();
  3. //设置开启数据库存储API权限
  4. settings.setDatabaseEnabled(true);
  5. //设置开启DOM存储API权限
  6. settings.setDomStorageEnabled(true);
  7. //设置是否开启定位功能
  8. settings.setGeolocationEnabled(true);
  9. //设置保存地理信息数据路径
  10. settings.setGeolocationDatabasePath("");
  11. //设置支持屏幕播放
  12. settings.setSupportZoom(true);
  13. //设置是否开启内置缩放机制
  14. settings.setBuiltInZoomControls(true);
  15. //设置开启内置缩放机制后是否显示缩放控件
  16. settings.setDisplayZoomControls(true);
  17. //设置支持JS
  18. settings.setJavaScriptEnabled(true);
  19. //设置是否使用预览模式加载页面
  20. settings.setLoadWithOverviewMode(true);
  21. //设置是否很使用viewport
  22. // false:加载页面的宽度总是使用webview
  23. //true:由页面的viewport标签决定
  24. settings.setUseWideViewPort(true);
  25. settings.setAllowContentAccess(true);
  26. //设置是否支持文件访问
  27. settings.setAllowFileAccess(true);
  28. settings.setAllowFileAccessFromFileURLs(true);
  29. //设置是否开启缓存
  30. settings.setAppCacheEnabled(true);
  31. //设置缓存的路径
  32. settings.setAppCachePath("/webCache/");
  33. //设置缓存模式
  34. settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
  35. //设置是否以http,https方式从网路加载图片资源
  36. settings.setBlockNetworkImage(true);
  37. //设置是否从网络加载资源
  38. settings.setBlockNetworkLoads(true);
  39. //设置是否支持保存表单数据
  40. settings.setSaveFormData(true);
  41. //设置webView的底层布局算法
  42. settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
4.3 WebViewClient
常用类简单总结:
  1. final WebViewClient webViewClient = new WebViewClient(){
  2. /*
  3. * 设置是否交由内置的webview来处理加载页面的操作
  4. * */
  5. @Override
  6. public boolean shouldOverrideUrlLoading(WebView view,String url){
  7. view.loadUrl(url);
  8. return true;
  9. }
  10. /*
  11. * 在webview开始加载URL时回调,方便开发者做一些操作
  12. * */
  13. @Override
  14. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  15. }
  16. /*
  17. * 在加载完当前页面时的回调方法
  18. * */
  19. @Override
  20. public void onPageFinished(WebView view, String url) {
  21. }
  22. @Override
  23. public void onLoadResource(WebView view, String url) {
  24. }
  25. /*
  26. * 指定页面访问错误时的回调方法
  27. * */
  28. @Override
  29. public void onReceivedError(WebView view, int errorCode,
  30. String description, String failingUrl) {
  31. }
  32. /*
  33. * 设置浏览器重复post提交
  34. * */
  35. @Override
  36. public void onFormResubmission(WebView view, Message dontResend,
  37. Message resend) {
  38. dontResend.sendToTarget();
  39. }
  40. /*
  41. * 通知应用程序可以将此URL保存到数据库,网页加载时只是调用一次
  42. * */
  43. @Override
  44. public void doUpdateVisitedHistory(WebView view, String url,
  45. boolean isReload) {
  46. }
  47. /*
  48. * 设置当加载页面出现SSL错误时我们应该做的操作,cancel还是proceed
  49. * */
  50. @Override
  51. public void onReceivedSslError(WebView view, SslErrorHandler handler,
  52. SslError error) {
  53. handler.proceed();
  54. }
  55. /*
  56. *收到客户端证书请求时的回调方法
  57. * */
  58. @Override
  59. public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
  60. //需要API 21以上
  61. request.cancel();
  62. }
  63. /*
  64. * 在webview接收到HTTP auth请求时的回调方法
  65. * */
  66. @Override
  67. public void onReceivedHttpAuthRequest(WebView view,
  68. HttpAuthHandler handler, String host, String realm) {
  69. handler.cancel();
  70. }
  71. /*
  72. * 键盘时间触发后的回调方法
  73. * 返回值为true,事件交由应用程序处理
  74. * 返回值为false,事件交由webview处理
  75. * */
  76. @Override
  77. public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
  78. return false;
  79. }
  80. /*
  81. * 作用:在view被縮放的时候的回调方法,也就是在发生缩放时间后,后续触发的动作
  82. * */
  83. @Override
  84. public void onScaleChanged(WebView view, float oldScale, float newScale) {
  85. }
  86. /*
  87. * 收到登陸请求时的方法回调
  88. * */
  89. @Override
  90. public void onReceivedLoginRequest(WebView view, String realm,
  91. String account, String args) {
  92. }
  93. };
4.4 WebChromeClient
常用类简单总结:
  1. WebChromeClient chromeClient = new WebChromeClient(){
  2. /*
  3. * 接收到一个标题时的回调方法
  4. * */
  5. @Override
  6. public void onReceivedTitle(WebView view, String title) {
  7. Log.d("title",title);
  8. }
  9. /*
  10. * 页面加载进度改变时候的回调
  11. * */
  12. @Override
  13. public void onProgressChanged(WebView view, int newProgress) {
  14. }
  15. /*
  16. *接收到一个新的图标时的回调方法
  17. * */
  18. @Override
  19. public void onReceivedIcon(WebView view, Bitmap icon) {}
  20. @Override
  21. public void onReceivedTouchIconUrl(WebView view, String url,
  22. boolean precomposed) {
  23. }
  24. /*
  25. * 通知主应用程序,当前页面将可能显示一个自定义的view视图
  26. * */
  27. @Override
  28. public void onShowCustomView(View view, CustomViewCallback callback) {
  29. }
  30. /*
  31. * 通知主应用程序,当前页面可能将隐藏一个自定义的view视图
  32. *
  33. * */
  34. @Override
  35. public void onHideCustomView() {}
  36. /*
  37. * 请求主应用程序创建新窗口
  38. * 该方法返回true表示响应这个请求,创建一个新webview插入视图中,并将resultMsg提交给他
  39. * 如果不需要响应则返回false
  40. * */
  41. @Override
  42. public boolean onCreateWindow(WebView view, boolean isDialog,
  43. boolean isUserGesture, Message resultMsg) {
  44. return false;
  45. }
  46. @Override
  47. public void onRequestFocus(WebView view) {}
  48. /*
  49. * 通知应用程序webview已经关闭,并在需要的时候从view中移除它
  50. * */
  51. @Override
  52. public void onCloseWindow(WebView window) {}
  53. /*
  54. * 通知客户端去显示一个JS 的 alert弹框,如果方法返回true,webview认为客户端需要处理
  55. * 如果返回false,webview内核自行处理
  56. * */
  57. @Override
  58. public boolean onJsAlert(WebView view, String url, String message,
  59. JsResult result) {
  60. return false;
  61. }
  62. /*
  63. * 通知客戶端需要显示个Confirm框,如果该方法返回true表示客户端会处理,并调用合适的JsResult处理方法
  64. * 如果返回false,内核默认自行处理
  65. * */
  66. @Override
  67. public boolean onJsConfirm(WebView view, String url, String message,
  68. JsResult result) {
  69. return false;
  70. }
  71. /*
  72. * 通知客户端展示一个Prompt弹框给用户,如果该方法返回true,webview认为客户端会处理,并调用合适的
  73. * JsPromptResult方法,如果返回false,内核默认自行处理
  74. * */
  75. @Override
  76. public boolean onJsPrompt(WebView view, String url, String message,
  77. String defaultValue, JsPromptResult result) {
  78. return false;
  79. }
  80. /*
  81. * 通知应用程序显示一个对话框,让用户选择是否离开当前页面,如果返回true
  82. * 表示客户端会处理,返回false,内核自行处理
  83. * */
  84. @Override
  85. public boolean onJsBeforeUnload(WebView view, String url, String message,
  86. JsResult result) {
  87. return false;
  88. }
  89. /*
  90. * 通知应用程序,web content需要请求定位,主应用程序需要调用指定的回调实现定位状态处理
  91. * */
  92. @Override
  93. public void onGeolocationPermissionsShowPrompt(String origin,
  94. GeolocationPermissions.Callback callback) {}
  95. @Override
  96. public void onGeolocationPermissionsHidePrompt() {}
  97. /*
  98. * 权限请求时候的回调
  99. * */
  100. @Override
  101. public void onPermissionRequest(PermissionRequest request) {
  102. request.deny();
  103. }
  104. /*
  105. * 取消权限请求时的回调
  106. * */
  107. @Override
  108. public void onPermissionRequestCanceled(PermissionRequest request) {}
  109. /*
  110. * 通过该方法吧JS的调试信息提交给主应用程序,方便应用程序展示调试
  111. * */
  112. @Override
  113. public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
  114. // Call the old version of this function for backwards compatability.
  115. onConsoleMessage(consoleMessage.message(), consoleMessage.lineNumber(),
  116. consoleMessage.sourceId());
  117. return false;
  118. }
  119. /*
  120. * HTML中的video在没有播放的时候会有一个默认的海报页面,是由HTML的video标签的poster属性指定
  121. * 如果HTML未指定,我们可以通过该函数指定默认的海报图片
  122. * */
  123. @Override
  124. public Bitmap getDefaultVideoPoster() {
  125. return null;
  126. }
  127. /*
  128. * 播放视频前会有一段时间缓存,我们可以通过该方法在数据缓存期间显示一个view
  129. * 优化用户体验
  130. * */
  131. @Override
  132. public View getVideoLoadingProgressView() {
  133. return null;
  134. }
  135. /*
  136. * 获取所有访问所有访问历史项,用于链接的着色
  137. * */
  138. @Override
  139. public void getVisitedHistory(ValueCallback<String[]> callback) {
  140. }
  141. };

5.webview与javascript(实现简单的JS与Android互调传参)

5.1 主布局文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <WebView
  6. android:layout_width="match_parent"
  7. android:layout_height="0dp"
  8. android:layout_weight="1"
  9. android:id="@+id/webView02"
  10. android:layout_gravity="center_horizontal" />
  11. <LinearLayout
  12. android:layout_width="match_parent"
  13. android:layout_height="0dp"
  14. android:layout_weight="1"
  15. android:orientation="vertical"
  16. >
  17. <TextView
  18. android:id="@+id/js_info"
  19. android:text="JS显示文本"
  20. android:layout_width="match_parent"
  21. android:layout_height="0dp"
  22. android:layout_weight="3"
  23. />
  24. <Button
  25. android:layout_weight="1"
  26. android:id="@+id/call_js"
  27. android:text="调用Js"
  28. android:layout_width="match_parent"
  29. android:layout_height="0dp"
  30. />
  31. </LinearLayout>
  32. </LinearLayout>

5.2 主布局Java类
  1. package com.example.webview;
  2. import android.annotation.SuppressLint;
  3. import android.os.Bundle;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.webkit.JavascriptInterface;
  8. import android.webkit.WebSettings;
  9. import android.webkit.WebView;
  10. import android.webkit.WebViewClient;
  11. import android.widget.Button;
  12. import android.widget.TextView;
  13. import android.widget.Toast;
  14. /**
  15. * Created by elimy on 2016-12-20.
  16. */
  17. public class JsAndAndroidActivity extends AppCompatActivity {
  18. private WebView webView;
  19. private Button call_Js;
  20. private TextView js_info;
  21. @SuppressLint("SetJavaScriptEnabled")
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.js_android_activity);
  26. webView= (WebView) findViewById(R.id.webView02);
  27. call_Js= (Button) findViewById(R.id.call_js);
  28. js_info= (TextView) findViewById(R.id.js_info);
  29. //重写WebViewClient的shouldOverrideUrlLoading方法,实现在webview内加载网页
  30. final WebViewClient webViewClient = new WebViewClient(){
  31. /*
  32. * 设置是否交由内置的webview来处理加载页面的操作
  33. * */
  34. @Override
  35. public boolean shouldOverrideUrlLoading(WebView view,String url){
  36. view.loadUrl(url);
  37. return true;
  38. }
  39. };
  40. webView.setWebViewClient(webViewClient);
  41. WebSettings settings = webView.getSettings();
  42. //开启JS的支持
  43. settings.setJavaScriptEnabled(true);
  44. webView.addJavascriptInterface(this,"client");
  45. //加载网页
  46. webView.loadUrl(" file:///android_asset/androidcalljs.html ");
  47. //设置按钮监听
  48. call_Js.setOnClickListener(new View.OnClickListener() {
  49. @Override
  50. public void onClick(View v) {
  51. //构造传递的参数
  52. Log.d("TAG", "onClick: ");
  53. //調用js中的javaUseJs()方法
  54. webView.loadUrl("javascript:javaUseJs(" + "'hello JS'"+ ")");
  55. }
  56. });
  57. }
  58. /*
  59. * 該方法提供给webview中的JS调用
  60. * */
  61. @JavascriptInterface
  62. public void androidFunc(final String str){
  63. Log.d("js_content",str);
  64. runOnUiThread(new Runnable() {
  65. @Override
  66. public void run() {
  67. Toast.makeText(JsAndAndroidActivity.this,str,Toast.LENGTH_LONG).show();
  68. js_info.setText("JS说:"+str);
  69. }
  70. });
  71. }
  72. }

5.3 HTML页面
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="content-type" content="text/html" charset="utf-8">
  5. <title>Title of the document</title>
  6. <script type="text/javascript">
  7. function javaUseJs(str){
  8. document.getElementById("content").innerHTML +=
  9. ("<br\>"+str);
  10. }
  11. function jsUseJava(str){
  12. client.androidFunc(str);
  13. }
  14. </script>
  15. </head>
  16. <body bgcolor="#7171C6">
  17. <h1 align="center">你好呀,我是Webview中的HTML哟,你点点下面的链接试试看...</h1><br/>
  18. <a onclick="jsUseJava('hello android')" style="align-content: center;">点我点我</a><br/>
  19. android说:
  20. <div id="content"></div>
  21. </body>
  22. </html>
5.4 效果截图

 6.webview加载URL或本地网页

6.1 webview加载assets下的网页
    前面案例中有使用,首先创建assets资源文件夹(提醒:注意与src同级,否则会出错),然后通过如下代码调用:
  1. webview.loadUrl("file:///android_asset/htmlfilename.html")
6.2 webview加载本地sdcard网页
    要实现加载sdcard html文件首先将文件文件导入sdcard路径下,再通过如下代码访问:
  1. webView.loadUrl("file:///mnt/sdcard/localsdcard.html");
6.3 webview直接加载服务器网页链接
  1. webView.loadUrl("http://www.baidu.com");
0 0
原创粉丝点击