热门标签 | 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文件











推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 本文介绍了在Windows系统下安装Python、setuptools、pip和virtualenv的步骤,以及安装过程中需要注意的事项。详细介绍了Python2.7.4和Python3.3.2的安装路径,以及如何使用easy_install安装setuptools。同时提醒用户在安装完setuptools后,需要继续安装pip,并注意不要将Python的目录添加到系统的环境变量中。最后,还介绍了通过下载ez_setup.py来安装setuptools的方法。 ... [详细]
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社区 版权所有