在服务中更改区域设置后重新加载本地化布局

时间:2017-08-09 20:15:07

标签: java android xml android-layout

我有一个键盘服务,向最终用户显示软键盘输入。我计划扩展它以支持多种语言,但在尝试使用新的本地化重新加载布局文件时遇到问题。

我的问题是,当触发配置更改时,字符串会根据区域设置更新其新的本地化版本,但布局不会更改以反映新的区域设置。

例如,我有这段代码:

//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 InputMethodServiceimplements 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更改区域设置之间的区别:

全英文(默认状态) Full English (Default state)

半西班牙语(通过应用程序代码更改了区域设置) Half Spanish (Locale changed via applicatio code); notice that the soft keys are translated but the layout is the same, so there is no ñ key

完整西班牙语(通过原生Android LocalePicker更改了区域设置) Full Spanish (Locale changed via native Android <code>LocalePicker</code>); notice we now have the ñ key

请注意,只有在上一张图片中我们才有可用的ñ键,表明我们的布局已正确重新加载。

我尝试了使视图无效(例如mInputView.invalidate())和手动调用onCreateInputView()之类的内容,但在重绘后,视图仍然显示旧的布局。

在区域设置更改后,我可以做些什么来重新加载布局?

0 个答案:

没有答案