Java 在服务中更改区域设置后重新加载本地化布局
我有一个键盘服务,它向最终用户显示软键盘输入。我计划扩展它以支持多种语言,尽管在尝试用新的本地化重新加载布局文件时遇到了问题 我的问题是,当触发配置更改时,字符串会根据区域设置使用其新的本地化版本进行更新,但布局不会更改以反映新的区域设置 例如,我有一段代码:Java 在服务中更改区域设置后重新加载本地化布局,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我有一个键盘服务,它向最终用户显示软键盘输入。我计划扩展它以支持多种语言,尽管在尝试用新的本地化重新加载布局文件时遇到了问题 我的问题是,当触发配置更改时,字符串会根据区域设置使用其新的本地化版本进行更新,但布局不会更改以反映新的区域设置 例如,我有一段代码: //Update configuration to reload localization Configuration config = getResources().getConfiguration(); config.setLocal
//Update configuration to reload localization
Configuration config = getResources().getConfiguration();
config.setLocale(locale); //locale is a Locale object for Spanish (Spain)
getBaseContext().getResources().updateConfiguration(config, null);
这是从扩展InputMethodService
并实现OnKeyboardActionListener
这将触发配置更改,因此当键盘视图出现时,我可以看到使用的一些字符串已更改为西班牙语。但是,布局似乎没有重新加载
作为参考,我有以下xml
文件:
layout_qwerty.xml
(部分信息已编辑)
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label_enter_key">Enter</string>
</resources>
我知道这在理论上是可行的,因为使用默认的安卓LocalePicker
来更改本地化会用新的布局和新的字符串更新键盘视图。只有当我自己以编程方式执行配置更改时,我才不会看到布局更新,只有字符串更新。在Android源代码中查看LocalePicker
触发配置更改的功能使用了顶级应用程序无法访问的隐藏类和函数,因此我认为我无法做到这一点。(参考方法)
下面的一些图片显示了通过应用程序代码更改语言环境和通过本机Android更改语言环境之间的区别LocalePicker
:
完全英语(默认状态)
半西班牙语(通过应用程序代码更改语言环境)
全西班牙语(通过本地Android更改语言环境LocaleEpicker
)
请注意,只有在最后一张图像中,我们才有可用的ñ键,这表明我们的布局已正确重新加载
我尝试过使视图无效(例如,mInputView.invalidate()
)和手动调用onCreateInputView()
),但在重新绘制视图后,视图仍然显示旧的布局
在区域设置更改后,我可以做些什么来重新加载布局吗
<?xml version="1.0" encoding="utf-8"?>
<Keyboard>
<Row>
<Key/> <!-- Some different key here, say ñ -->
...
<Key/>
</Row>
</Keyboard>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label_enter_key">Enter</string>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label_enter_key">Intro</string>
</resources>