You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebView中JS调用Java方法获取本地化字符串返回空的问题

解决WebView中JS调用Java获取本地化字符串的问题

看来你遇到的核心问题是JS传递的参数类型和Java方法预期不匹配,导致资源ID解析错误,要么返回空字符串,要么抛出Resources$NotFoundException。我们来一步步拆解并解决这个问题:

问题根源分析

你的Java方法getLocalizedString定义的参数是int stringId,但JS代码里传递的是字符串常量名(比如"Consult.JSSupport.checkbox.selected")。而Android的getResources().getString(int id)需要的是R.string类中生成的int型资源ID,不是字符串形式的资源名称。当你把字符串传给int类型的参数时,Java会把它解析成0(字符串转int失败),这就导致了String resource ID #0x0的报错。


解决方案:调整Java方法适配字符串参数

最合理的做法是修改Java端的方法,让它接收字符串形式的资源名称,再通过Android API映射到对应的资源ID。具体修改如下:

1. 修改Java端的接口方法

private class CalculatorJavaScriptCallInterface {
    CalculatorJavaScriptCallInterface() { }

    @JavascriptInterface
    public String getLocalizedString(final String stringName) {
        // 根据资源名称获取对应的int型ID
        int resId = getResources().getIdentifier(
            stringName, 
            "string", 
            getActivity().getPackageName()
        );

        if (resId == 0) {
            // 找不到对应资源时的处理
            getActivity().runOnUiThread(() -> 
                Toast.makeText(getActivity(), "资源未找到:" + stringName, Toast.LENGTH_SHORT).show()
            );
            return "";
        }

        String localizedString = getResources().getString(resId);
        // 注意:Toast需要在UI线程执行,所以用runOnUiThread包裹
        getActivity().runOnUiThread(() -> 
            Toast.makeText(getActivity(), "获取到字符串:" + localizedString, Toast.LENGTH_SHORT).show()
        );
        return localizedString;
    }
}

2. 保持JS代码不变

现在你的JS代码可以直接传递字符串资源名称,不需要做任何修改:

$.fn.checkboxpicker.defaults = {
    offLabel: window.calculatorjavascriptcallinterface.getLocalizedString("Consult.JSSupport.checkbox.selected"),
    onLabel: window.calculatorjavascriptcallinterface.getLocalizedString("Consult.JSSupport.checkbox.notSelected"),
};

额外注意事项

  • 确保WebView已开启JavaScript支持:
    webView.getSettings().setJavaScriptEnabled(true);
    
  • 必须保留@JavascriptInterface注解:这是Android 4.2+之后JS调用Java方法的强制要求,否则方法无法被JS识别。
  • 线程安全:UI操作(比如Toast)必须在UI线程执行,所以用runOnUiThread包裹相关代码,避免崩溃。

这样修改后,JS就能正确获取到strings.xml中定义的本地化字符串了,不用再为每种语言编写多份JS代码。

内容的提问来源于stack exchange,提问作者GAMA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:40:24