我有一个键盘服务,向最终用户显示软键盘输入。我计划扩展它以支持多种语言,但在尝试使用新的本地化重新加载布局文件时遇到问题。
我的问题是,当触发配置更改时,字符串会根据区域设置更新其新的本地化版本,但布局不会更改以反映新的区域设置。
例如,我有这段代码:
//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);
这是从extends InputMethodService
和implements OnKeyboardActionListener
这将触发配置更改,因此当键盘视图出现时,我可以看到所使用的某些字符串已更改为西班牙语。但是,似乎布局还没有重新加载。
作为参考,我有以下xml
个文件:
layout_qwerty.xml
(某些信息已编辑)
<?xml version="1.0" encoding="utf-8"?>
<Keyboard>
<Row>
<Key/>
...
<Key/>
</Row>
</Keyboard>
layout_qwerty.xml (es)
(某些信息已编辑)
<?xml version="1.0" encoding="utf-8"?>
<Keyboard>
<Row>
<Key/> <!-- Some different key here, say ñ -->
...
<Key/>
</Row>
</Keyboard>
strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label_enter_key">Enter</string>
</resources>
strings.xml (es)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="label_enter_key">Intro</string>
</resources>
我知道这在理论上有效,因为使用默认的Android LocalePicker
更改本地化更新键盘视图的新布局以及新字符串。只有在以编程方式执行配置更改时,我才会看到更新的布局,只有字符串。在LocalePicker
触发配置更改的内容中查看Android源代码使用了顶层应用程序无法访问的隐藏类和函数,因此我认为我无法做到这一点。 (参见updateConfiguration方法参考)
以下是一些图片,显示了通过应用程序代码更改区域设置与通过原生Android LocalePicker
更改区域设置之间的区别:
完整西班牙语(通过原生Android LocalePicker
更改了区域设置)
请注意,只有在上一张图片中我们才有可用的ñ键,表明我们的布局已正确重新加载。
我尝试了使视图无效(例如mInputView.invalidate()
)和手动调用onCreateInputView()
之类的内容,但在重绘后,视图仍然显示旧的布局。
在区域设置更改后,我可以做些什么来重新加载布局?