【问题标题】:Call Java method from JavaScript and return value to JavaScript从 JavaScript 调用 Java 方法并将值返回给 JavaScript
【发布时间】:2018-05-25 06:34:59
【问题描述】:

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

这是我想要实现的目标: 在 WebView 中显示 2 个字符串 - 比如说 YesNo。但是它们需要本地化,因此我想从 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 返回硬编码值 方法 - 它是这样工作的

任何建议将不胜感激。提前致谢!


编辑 即使 strings.xml 中存在字符串,我也会收到以下错误:

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

【问题讨论】:

  • 您可能需要进行异步调用
  • 你有setJavaScriptEnabled 吗?你的getLocalizedString 被叫到了吗?
  • @sagar - 是的。如何验证?请查看问题中的重要更新。
  • @brk - 你能详细说明一下吗?
  • @GAMA 您的 Toast 消息是否显示正确的字符串?

标签: javascript android android-webview


【解决方案1】:

获取具有正确 ID 的字符串似乎存在问题。更改您的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;
}

【讨论】:

  • 嗨@Sagar - 它就像一个魅力。小改动 - 需要使用 getContext().getPackageName() 而不是 getPackageName()
  • @GAMA 太棒了!感谢更新。我已经更新了答案
【解决方案2】:

1.)

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

2.)

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.
    }

3.)

 <html>
    <head>
        <script type="text/javascript" src="/js/MyJS.js"></script>
    </head>
    <body>
        <button onClick="mClick('1');">Yes</button>
        <button onClick="mClick('0');">No</button>
    </body>
</html>

4.) javascript: MyJS.js

function mClick(mValue)
{
    Android.performAction(mId);
}

【讨论】:

  • 嗨@Akash - 我几乎在做与问题相同的事情,但没有成功。
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多