从JavaScript调用Java方法并将值返回给JavaScript

时间:2018-05-25 06:34:59

标签: javascript android android-webview

关于从Javascript调用Java类方法的SO问题和其他文章很少,但它们都处理返回类型为void的java方法。

这是我想要实现的目标: WebView中有2个字符串显示 - 例如。但是它们需要本地化,因此我想从Java方法中获取字符串值,而不是为每个语言环境使用多个JS。

以下是代码示例: Java类

onCreate(){
//Some code
contentWebView.addJavascriptInterface(new CalculatorJavaScriptCallInterface(), "calculatorjavascriptcallinterface");
//Some code
}

String localizedString = "";
private class CalculatorJavaScriptCallInterface {
    CalculatorJavaScriptCallInterface() {
    }

    @JavascriptInterface
    public String getLocalizedString(final int stringId) {
        localizedString = getResources().getString(stringId);
        Toast.makeText(getActivity(), "localizedString :: " + localizedString, Toast.LENGTH_SHORT).show();

        return localizedString;
    }
}

Javascript文件

  function Checkboxpicker(element, options) {
    //Some code
    this.options = $.extend({}, $.fn.checkboxpicker.defaults, options, this.$element.data());
}
  $.fn.checkboxpicker.defaults = {
    //EXISTING STRINGS
    //offLabel: 'No',
    //onLabel: 'Yes',
    offLabel: window.calculatorjavascriptcallinterface.getLocalizedString("Consult.JSSupport.checkbox.selected"),
    onLabel: window.calculatorjavascriptcallinterface.getLocalizedString("Consult.JSSupport.checkbox.notSelected"),
  };

当我在代码上面运行时,我得到空白字符串作为输出。

以下是一些注释:

  1. 如果我使用的话,这个Javascript正在被适当地使用 硬编码字符串
  2. 已定义了各自的叮咬 string.xml
  3. 我尝试使用calculatorjavascriptcallinterface 骆驼案和小写都
  4. 我尝试使用和不使用window. 调用Java方法
  5. 尝试从Java返回硬编码值 方法 - 这是以这种方式工作
  6. 任何建议将不胜感激。提前谢谢!

    修改 即使字符串出现在 strings.xml 中,我也会收到以下错误:

    No package identifier when getting value for resource number 0x00000000
    android.content.res.Resources$NotFoundException: String resource ID #0x0
    

2 个答案:

答案 0 :(得分:1)

看起来像获取具有正确ID的String的问题。按如下方式更改getLocalizedString

@JavascriptInterface
public String getLocalizedString(final String stringId) {
    localizedString = getResources().getString(getResources().getIdentifier(stringId,"string",getContext().getPackageNam‌​e()));
    Toast.makeText(getActivity(), "localizedString :: " + localizedString, Toast.LENGTH_SHORT).show();

    return localizedString;
}

答案 1 :(得分:0)

1。)

{1,2,3,4,5,6,7,8}

2)。

{2,3,4,5,6,7,8,9}

3。)

 mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.getSettings().setDomStorageEnabled(true);
    mWebView.addJavascriptInterface(new WebViewInterface(this), "Android");
    mWebView.loadUrl("url or html file path");

4。)javascript:MyJS.js

public class WebViewInterface {

    Context mContext;

    WebViewInterface(Context mContext) {
        this.mContext = mContext;
    }

    @JavascriptInterface
    public void performAction(String pro_cat_id) {
          //write your code here to perform any action.
    }