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
相关产品推荐
相关产品推荐

