android webview与js交互(动态添加js)

1、本地html与本地html里的js交互

2、本地html与本地js交互

3、网络html与网络js交互

4、网络html与本地js交互

5、各个情况动态添加js

以上5点都可以用一种方式来模拟,在本篇中采用本地html与本地js交互 (包含动态添加js的操作)

6、拦截url请求(在webview加载完成以后,触发的请求url)

7、拦截url请求后返回自己封装的数据(基于第6点,加载完成后,触发一些请求数据的url时拦截并自己封装数据返回给webview)

注:6、7点将在下一篇博客介绍

webview能做什么?此段引用vanezkw 感谢作者

1)、webView可以利用html做界面布局,虽然目前还比较少人这么使用,不过我相信当一些客户端需要复杂的图文(图文都是动态生成)混排的时候它肯定是个不错的选择。

2)、直接显示网页,这功能当然也是它最基本的功能。

3)、和js交互。(如果你的js基础比java基础好的话那么采用这种方式做一些复杂的处理是个不错的选择)

一、本地html与本地js交互(本地html引用本地js)

注:此例为本地html与本地js交互,如想在本地html添加js,将js.js代码复制到html对应<script></script>标签内即可

首先在assets文件夹得有两个文件.html、.js

test.html

<body>
<a href="http://www.baidu.com">js中调用本地方法</a>
<script src="file:///android_asset/js.js"></script>
<p></p>
<div id="mydiv">

</div>
</body>

js.js

function funFromjs(){
    document.getElementById("mydiv").innerHTML="获取id为mydiv的元素,并向其中添加文字!";
    myObj.fun1FromAndroid("我的myObj回调");
}

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.yanqy.yqy_jsexample.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="UI触发webview中的js"
        android:id="@+id/mButton"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <WebView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/mWebView"
        android:layout_below="@+id/mButton"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

MainActivity.xml

package com.yanqy.yqy_jsexample;

import android.content.Context;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;
    private Button mBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtn = (Button) findViewById(R.id.mButton);
        mWebView = (WebView) findViewById(R.id.mWebView);
        //设置编码
        mWebView.getSettings().setDefaultTextEncodingName("utf-8");
        //支持js
        mWebView.getSettings().setJavaScriptEnabled(true);
        //设置背景颜色 透明
        mWebView.setBackgroundColor(Color.argb(0, 0, 0, 0));
        //设置本地调用对象及其接口
        mWebView.addJavascriptInterface(new JavaScriptObject(this), "myObj");
        //载入网页
        mWebView.loadUrl("file:///android_asset/test.html");

        //点击调用js中方法
        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mWebView.loadUrl("javascript:funFromjs()");
            }

        });
    }

    final class JavaScriptObject {

        private Context mContxt;

        public JavaScriptObject(Context mContxt) {
            this.mContxt = mContxt;
        }

        @JavascriptInterface //sdk17版本以上加上注解
        public void funFromAndroid(String name) {
            //在此可以通过js返回数据name进行操作
            Toast.makeText(mContxt, "调用funFromAndroid:" + name, Toast.LENGTH_LONG).show();
        }
    }
}

二、本地html动态添加js

同上首先在assets文件夹有.html、.js文件

test.xml   将<script></script>标签与其内容删除

<body>
<a href="http://www.baidu.com">js中调用本地方法</a>
<p></p>
<div id="helloweb">

</div>
</body>

js.js  同第一点不变

function funFromjs(){
    myObj.fun1FromAndroid("第一个js回调");
}

MainActivity.java

需要读取js并添加到webview中才能达到添加js的效果

读取js添加到String 类型中

    //js文本
    private String wholeJS = "";
<span style="white-space:pre">	</span>//获取js文本
        InputStream mIs = null;
        try {
            mIs = getResources().getAssets().open("js.js");
            if(mIs != null){
                byte buff[] = new byte[1024];
                ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
                FileOutputStream out = null;
                do {
                    int numread = 0;
                    numread = mIs.read(buff);
                    if (numread <= 0) {
                        break;
                    }
                    fromFile.write(buff, 0, numread);
                } while (true);
                wholeJS = fromFile.toString();
            }else{
                Toast.makeText(MainActivity.this, "js加载失败", Toast.LENGTH_SHORT).show();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

webview添加读取的js

mWebView.loadUrl("javascript:" + wholeJS);

MainActivity完整代码

package com.yanqy.yqy_jsexample;

import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    private WebView mWebView;
    private Button mBtn;

    //js文本
    private String wholeJS = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtn = (Button) findViewById(R.id.mButton);
        mWebView = (WebView) findViewById(R.id.mWebView);
        //设置编码
        mWebView.getSettings().setDefaultTextEncodingName("utf-8");
        //支持js
        mWebView.getSettings().setJavaScriptEnabled(true);
        //设置背景颜色 透明
        mWebView.setBackgroundColor(Color.argb(0, 0, 0, 0));
        //设置本地调用对象及其接口
        mWebView.addJavascriptInterface(new JavaScriptObject(this), "myObj");
        //载入网页
        mWebView.loadUrl("file:///android_asset/test.html");

        //点击调用js中方法
        mBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //触发html中的js
                mWebView.loadUrl("javascript:funFromjs()");
            }

        });

        //获取js文本
        InputStream mIs = null;
        try {
            mIs = getResources().getAssets().open("js.js");
            if(mIs != null){
                byte buff[] = new byte[1024];
                ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
                FileOutputStream out = null;
                do {
                    int numread = 0;
                    numread = mIs.read(buff);
                    if (numread <= 0) {
                        break;
                    }
                    fromFile.write(buff, 0, numread);
                } while (true);
                wholeJS = fromFile.toString();
            }else{
                Toast.makeText(MainActivity.this, "js加载失败", Toast.LENGTH_SHORT).show();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        //webview添加读取的js
        mWebView.loadUrl("javascript:" + wholeJS);
    }

    final class JavaScriptObject {

        private Context mContxt;

        public JavaScriptObject(Context mContxt) {
            this.mContxt = mContxt;
        }

        @JavascriptInterface //sdk17版本以上加上注解
        public void funFromAndroid(String name) {
            //在此可以通过js返回数据name进行操作
            Toast.makeText(mContxt, "调用funFromAndroid:" + name, Toast.LENGTH_LONG).show();
        }
    }
}

activity_main.xml 同第一点不变

第6、7点将在下一篇博客介绍关于拦截 与 webview一些常用的监听事件

时间: 2024-10-13 22:25:27

android webview与js交互(动态添加js)的相关文章

js 如何动态添加数组_百度知道

1.数组的创建var arrayObj = new Array(); //创建一个数组var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度var arrayObj = new Array([element0[, element1[, ...[, elementN]]]]); 创建一个数组并赋值 要说明的是,虽然第二种方法创建数组指定了长度,但实际上所有情况下数组都是变长的,也就是说即使指定了长度为5,仍然可以将元素存储在规定长度以外

Android WebView加载Chromium动态库的过程分析

Chromium动态库的体积比较大,有27M左右,其中程序段和数据段分别占据25.65M和1.35M.如果按照通常方式加载Chromium动态库,那么当有N个正在运行的App使用WebView时,系统需要为Chromium动态库分配的内存为(25.65 + N x 1.35)M.这是非常可观的.为此,Android使用了特殊的方式加载Chromium动态库.本文接下来就详细分析这种特殊的加载方式. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 为什么当有

动态添加js文件.

方法一: $.getScript(url,callback); 这个方法是对$.ajax({ })的封装.默认是异步的而且是带有缓存的. 缓存对于用户来说,是个好东西,但是对于开发者来说可就是日了狗的东西了. 如果需要加载一个js文件或者多个没有相互依赖关系的js文件是没有问题的, 但是如果添加添加多个具有相互依赖关系的js文件,异步就会出现问题了. 可以从$.ajax()入手. function getScript(url){ $.ajax({ url: url, dataType: "scr

如何使用validate.js进行动态添加和移除表单验证信息

表单是我们在开当中的常客,那么对表单的验证也是必须的,那么如何实现动态给表单添加验证规则呢? 方法: 1,动态添加验证规则 // 添加$("#addConnectUser").rules("add",{rules:{required:true,isString:true},messages:{required:"用户名为必填项",isString:"请输入规范字符"}});// 移除 $("#addConnectUs

Android WebView与JavaScript交互操作(Demo)

应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http://blog.csdn.net/mahoking/article/details/30235243 采用这种模式,为了解决更好的用户体验,可访问本地资源的能力.势必需要了解与掌握Android(java)与JavaScript之间的交互.相互调用操作的方法与技术. [转载使用,请注明出处:http://

Android 在布局容器中动态添加控件

这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉已有的控件 3.使用,来个小demo就明白了 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

js文件动态添加的实现

基于AMD和CMD的模块开发和按需加载,给我们的开发过程带来了便捷. 今天就来就分享一个自己在项目开发中用到的一个按需加载js的一个方法,不多说,直接ps代码啦 /** * JS 加载到顶部 * @param {String} url * @param {Boolean} 请求并加载 * @param {Function} fn * @return {Boolean} */ function requireJs(url, multi, fn) { if (typeof multi == 'fun

动态添加JS文件到页面

/*** ** 功能: 加载外部JS文件,加载完成后执行回调函数callback ***/ var utools = { config: { id: "", url: "", charset: "gb2312", callback: function () { } }, merge: function (a, c) { for (var b in c) a[b] = c[b]; return a }, getScript: function (a

js jquery 动态添加表格

for循环将你要添加的标签写上,然后直接var talbeAdd=""for(){ tableAdd+="<tr><td>这儿写你要添加的内容</td></tr>"; }$("table").append("这个写你要添加的标签");你想通过什么事件添加自己写