您当前的位置: 首页 >  交互

ZhangJiQun&MXP

暂无认证

  • 0浏览

    0关注

    1187博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Android实现WebView加载assets文件夹下的html文件,html返回webView.canGo,android嵌入h5进行交互,调试错误 net::ERR_FILE_NOT_FOUND

ZhangJiQun&MXP 发布时间:2020-04-10 19:07:49 ,浏览量:0

调试错误 net::ERR_FILE_NOT_FOUND 

我的环境:win7 ,Android studio 3.0.1.   java8;

webView.loadUrl("file:android_asset/text");

html超链接在 Android studio 中的使用:

点击

html返回webView.canGo,goBack
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {

            if (webView.canGoBack()) {
                webView.goBack();

            } else {
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

 

Android和H5之间的交互

1、webView加载页面 我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同: //例如:加载assets文件夹下的test.html页面

webView.loadUrl("file:android_asset/text");

:加载网页

mWebView.loadUrl("http://www.baidu.com")

如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:

mWebView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    mWebView.loadUrl(url);
                    return true;
                }
            }

2、Android本地通过Java调用HTML页面中的JavaScript方法 想要调用js方法那么就必须让webView支持 WebSettings webSettings = mWebView.getSettings(); //设置为可调用js方法 webSettings.setJavaScriptEnabled(true); 若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("JavaScript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:

        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                webView.evaluateJavascript("sum(1,2)", new ValueCallback() {
                    @Override
                    public void onReceiveValue(String value) {
                        tv.setText("sum= "+value);
                    }
                });
            }
        });

js代码如下:


function sum(a,b){
return a+b;
}


2、js调用Android本地Java方法 在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法

package com.itep.myapplication;

import android.webkit.JavascriptInterface;

/**
 * Created by Administrator on 2020/4/10 0010.
 */

public class JsInteration {
    @JavascriptInterface
    public String back() {
        return "hello world";
    }

}

定义完这个方法后再调用mWebView.addJavascriptInterface()方法:

webView.addJavascriptInterface(new JsInteration(), "android_ceshi");

那么在js中怎么来调用呢?




    
    text 2
    dianji
    
    function sum(a,b){
    return a+b;
    }
     function s(){
    var result =window.android_ceshi.back();
    document.getElementById("p").innerHTML=result;
    }
     function ceshi(){

   var ss="123";
   document.write(ss);
    }


    


调用本地方法
点击

4、拦截HTML页面中的点击事件

        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断url拦截事件
                if (url.equals("file:///android_asset/text2")) {
                    Log.e(TAG, "shouldOverrideUrlLoading: " + url);
                    startActivity(new Intent(MainActivity.this,MainActivity_two.class));
                    return true;
                } else {
                    webView.loadUrl(url);
                    return false;
                }
            }
        });

 

tex.html




    
    

你好你好script type你好script type你好script type你好script type

dianji dianji dianji dianji dianji dianji function sum(a,b){ return a+b; } function s(){ var result =window.android.back(); document.getElementById("p").innerHTML=result; } function ceshi(){ var ss="123"; document.write(ss); } 点击 调用本地方法

ceshi

text2.html




    
    text 2
    dianji
    
    function sum(a,b){
    return a+b;
    }
     function s(){
    var result =window.android.back();
    document.getElementById("p").innerHTML=result;
    }
     function ceshi(){

   var ss="123";
   document.write(ss);
    }


    


调用本地方法
点击

 

MainActivity.class

package com.itep.myapplication;

import android.content.Intent;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    WebView webView;
    TextView tv;

    /**
     * @param savedInstanceState
     */
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        webView = findViewById(R.id.wb);
        WebSettings webSettings = webView.getSettings();
        //设置为可调用js方法
        webSettings.setJavaScriptEnabled(true);
        webView.getSettings().setDefaultTextEncodingName("utf-8");
//        webView.loadUrl("file:android_asset/text.html");
        webView.loadUrl("file:android_asset/text");
        // Example of a call to a native method
        tv = (TextView) findViewById(R.id.sample_text);
        webView.addJavascriptInterface(new JsInteration(), "android");
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断url拦截事件
                if (url.equals("file:///android_asset/text2")) {
                    Log.e(TAG, "shouldOverrideUrlLoading: " + url);
                    startActivity(new Intent(MainActivity.this,MainActivity_two.class));
                    return true;
                } else {
                    webView.loadUrl(url);
                    return false;
                }
            }
        });
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        //        tv.setText(new Text().stringFromJNI());
    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

 

JsInteration:
package com.itep.myapplication;

import android.webkit.JavascriptInterface;

/**
 * Created by Administrator on 2020/4/10 0010.
 */

public class JsInteration {
    @JavascriptInterface
    public String back() {
        return "hello world";
    }

}

 

关注
打赏
1665659684
查看更多评论
立即登录/注册

微信扫码登录

0.0435s