热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebView简介(JavaScripte篇)

原文:http:www.cnblogs.comoakpiparchive201104082009800.html如果访问的页面中有Javascript,
原文:http://www.cnblogs.com/oakpip/archive/2011/04/08/2009800.html
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
        
webview.getSettings().setJavascriptEnabled(true);  
我 们来了解一下android中webview是如何支持Javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以 为所欲为了。
看一个实例:
WebViewDemoActivity.java文件

package com.teleca.robin;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.webkit.WebSettings;

import android.webkit.WebView;

public class WebViewDemoActivity extends Activity {

/** Called when the activity is first created. */

final static String tag="robin";

WebView mWebView;

Handler mHandler=new Handler();

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.webviewdemo);       

        mWebView = (WebView) findViewById(R.id.webView);       

        WebSettings webSettings = mWebView.getSettings();       

        webSettings.setJavascriptEnabled(true);       

        mWebView.addJavascriptInterface(new Object() {       

            public void clickOnAndroid() {       

                mHandler.post(new Runnable() {       

                    public void run() {       

                        mWebView.loadUrl("Javascript:wave()");    

                        Log.i(tag,"clickOnAndroid");

                    }       

                });       

            }       

        }, "demo");       

        mWebView.loadUrl("file:///android_asset/demo.html");   

}

}

assets\demo.html文件

      

      

      

demo.clickOnAndroid()">       

droid" src="android_normal.png" mce_src="android_normal.png"/>
      

Hello,are you all right?       

      

      

我 们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个Javascript对象中,Javascript对象名就是 “demo”,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 Javascript:window.demo访问到绑定的java对象了。

   这样在Javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用Javascript的例子。

这里还有几个知识点: 
1) 为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"
 
2)addJavascriptInterface方法中要绑定的Java对象及方法不要直接在里面运行,这里是使用 Handler来进行的。

原文:http://www.cnblogs.com/oakpip/archive/2011/04/10/2011165.html

程序英文原址:http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/ 

我对其进行了修改,并加了简单的注释,这个例子的不仅是对js的操作,它还对android浏览器做了简单的介绍, 
这些我会在注释中一一讲解。 
Javascript弹出框有如下三种: 
Javascript代码如下:   

alert(); 或alert("alert");

window.confirm("Are you srue?");  

window.prompt("Please input some word";,"this is text");  

WebChromeClient 中对三种dialog进行了捕捉,但不幸的是,并没有回调函数可以使用, 或者说不能获得用户是点击“OK”还是“CANCEL”的操作结果。 
个人以为,这些方法的设置是为了对一些涉及到html操作的应用程序进行测试时使用的。 
在WebChromeClient中还有以下的方法: 
Java代码  
    onProgressChanged(WebView view, int newProgress);  
    onReceivedIcon(WebView view, Bitmap icon);  
    onReceivedTitle(WebView view, String title);  
    onRequestFocus(WebView view);  
    onCloseWindow(WebView window);  
    onProgressChanged(WebView view, int newProgress)  

这些方法的使用我会在以后的博文中讲到. 
请大家先看今天讲解的重点 
WebViewDemo2Activity.java文件 

package com.teleca.robin;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.os.Handler;

import android.util.Log;

import android.webkit.JsPromptResult;

import android.webkit.JsResult;

import android.webkit.WebChromeClient;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.widget.TextView;

public class WebViewDemo2Activity extends Activity {

/** Called when the activity is first created. */

final static String tag="robin";

WebView mWebView;

Handler mHandler=new Handler();

TextView mReusultText;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.webviewdemo2);

mReusultText = (TextView) findViewById(R.id.textView);  

        mWebView = (WebView) findViewById(R.id.webView);       

        WebSettings webSettings = mWebView.getSettings();

        mWebView.setWebChromeClient(new MyWebChromeClient());  

        webSettings.setJavascriptEnabled(true);      

        mWebView.loadUrl("file:///android_asset/demo2.html");   

}

  /** 

     * 继承WebChromeClient类 

     * 对js弹出框时间进行处理 

     *  

     */  

    final class MyWebChromeClient extends WebChromeClient {  

        /** 

         * 处理alert弹出框 

         */  

        @Override  

        public boolean onJsAlert(WebView view,String url, String message,JsResult result) {  

            Log.d(tag,"onJsAlert:"+message);  

            mReusultText.setText("Alert:"+message);  

            //对alert的简单封装  

            new AlertDialog.Builder(WebViewDemo2Activity.this).  

                setTitle("Alert").setMessage(message).setPositiveButton("OK",  

                new DialogInterface.OnClickListener() {  

                    @Override  

                    public void onClick(DialogInterface arg0, int arg1) {  

                       //TODO  

                   }  

            }).create().show();  

            result.confirm();  

            return true;  

        }  

        /** 

         * 处理confirm弹出框 

         */  

        @Override  

        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {  

            Log.d(tag, "onJsConfirm:"+message);  

            mReusultText.setText("Confirm:"+message);  

            result.confirm();  

            return super.onJsConfirm(view, url, message, result);  

        }  

        /** 

         * 处理prompt弹出框 

         */  

        @Override  

        public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {  

            Log.d(tag,"onJsPrompt:"+message);  

            mReusultText.setText("Prompt input is :"+message);  

            result.confirm();  

            return super.onJsPrompt(view, url, message, message, result);  

        }  

    }  

}

demo2.html文件











推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • 在HTML5应用中,Accordion(手风琴,又称抽屉)效果因其独特的展开和折叠样式而广泛使用。本文探讨了三种不同的Accordion交互效果,通过层次结构优化信息展示和页面布局,提升用户体验。这些效果不仅增强了视觉效果,还提高了内容的可访问性和互动性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在使用 `requests` 库进行 HTTP 请求时,如果遇到 `requests.exceptions.SSLError: HTTPSConnectionPool` 错误,通常是因为 SSL 证书验证失败。解决这一问题的方法包括:检查目标网站的 SSL 证书是否有效、更新本地的 CA 证书库、禁用 SSL 验证(不推荐用于生产环境)或使用自定义的 SSL 上下文。此外,确保 `requests` 库和相关依赖项已更新到最新版本,以避免潜在的安全漏洞。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • CSS3 @font-face 字体应用技术解析与实践
    在Web前端开发中,HTML教程和CSS3的结合使得网页设计更加多样化。长期以来,Web设计师受限于“web-safe”字体的选择。然而,CSS3中的`@font-face`规则允许从服务器端加载自定义字体,极大地丰富了网页的视觉效果。通过这一技术,设计师可以自由选择和使用各种字体,提升用户体验和页面美观度。本文将深入解析`@font-face`的实现原理,并提供实际应用案例,帮助开发者更好地掌握这一强大工具。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
author-avatar
飘联盟-小马_934
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有