如何获取return字符串在Android中的javascript函数?

How to get the javascript function that return string in Android?

我想在我的 android 应用程序中从 JavaScript 函数中烘烤一个 return 字符串,我已经搜索并尝试了几天的代码,但似乎我得到了找不到正确的运气。

这里是我要在android中调用到return一个字符串值

的JS函数
function myFunction()
    {
        var str= document.getElementsByName('txt')[0].value;    
        window.android.myFunction(str); 
    }

MainActivity.java

        //create interface
        JsInterface jsInterface = new JsInterface();

        wv.setWebViewClient(new WebViewClient());
        wv.setWebChromeClient(new WebChromeClient());
        wv.getSettings().setJavaScriptEnabled(true);

        //add interface
        wv.addJavascriptInterface(jsInterface, "android");//android is the keyword that will be exposed in js

        //load file
        wv.loadUrl("file:///android_asset/test.html");

 Toast.makeText(getApplicationContext(), myFunction(), Toast.LENGTH_LONG);        
    }

    //javascript interface
    private class JsInterface{
        public String myFunction(String msg){
            return msg;
        }
    }

我是这种平台的新手,也是Javascript。我感谢那些会回答的人。谢谢。

我认为您需要对代码进行以下更改:

  1. 运行 WebViewClient.onPageFinished 中的 Java 脚本函数以确保文档已实际加载,并且为了 运行 它,使用 loadUrl() 函数和 javascript: URL:

    wv.setWebViewClient(new WebViewClient() {
        @Override
        void onPageFinished(WebView view, String url) {
            view.loadUrl("javascript:myFunction();void(0);");
        }
    }
    
  2. @JavascriptInterface 注释注释要公开的 Java 方法(并将其设为 void,因为您实际上不想 return 返回 JavaScript),并从其中调用 Toast.makeText(),但确保切换到 UI 线程,因为注入了 Java 方法 运行 在专用后台线程上:

    private class JsInterface {
        private Context mContext;
    
        JsInterface(Context context) {
            mContext = context;
        }
    
        @JavascriptInterface
        public void myFunction(String msg) {
            new Handler(Looper.getMainLooper()).post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(mContext, msg, Toast.LENGTH_LONG);
                }
            });
        }
    }
    
  3. 并在创建时将应用程序上下文传递给 JsInterface

    JsInterface jsInterface = new JsInterface(getApplicationContext());
    

另请注意,您的 Java 脚本中有两个名为 myFunction 的函数:一个在注入对象中,可通过 android.myFunction() 访问,另一个是您自己定义的,它仅作为 myFunction()window.myFunction() 提供。其实还是用不同的名字比较好,以免混淆。