Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在服务中更改区域设置后重新加载本地化布局_Java_Android_Xml_Android Layout - Fatal编程技术网

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>