问题 动态Android应用程序本地化


我读过了 这里 Android应用程序中的本地化通过随应用程序部署的XML文件进行。

是否可以在运行时将这些XML文件动态加载到应用程序中?

如果没有,是否有可能覆盖UI XML和资源XML之间的绑定,以便我可以绑定到我自己的,动态加载的XML文件而不是 res/values

谢谢


10719
2018-01-11 16:17


起源



答案:


是否可以在运行时将这些xml文件动态加载到应用程序中?

不,对不起

如果没有,是否可以覆盖UI xml和资源XML之间的绑定,以便我可以绑定到我自己的,动态加载的xml文件而不是res / values中的文件?

没什么 res/values/ 永远使用,除非你使用它。因此,没有什么可以“覆盖”。

例如,假设你有一个 TextView。您希望它显示一些文本。您希望该文本已本地化。通常,您将设置一系列字符串资源,每个翻译一个,然后使用这些字符串资源 TextView (例如。, android:text 在布局中,或 setText() 在Java)。在你的情况下,你不会设置字符串资源,但“做你自己的事情”,并打电话 setText() 如所须。

您在方法中失去的是自动转换。如果用户在您的应用程序运行时切换语言,Android会将其视为配置更改,并在返回到前台时重新启动您的活动。通常,这会自动加载新的字符串资源。在您的情况下,它不会,因为您没有使用字符串资源。相反,您需要告诉Android不要重新启动您的活动(通过 android:configChanges)并手动重新加载所有 TextView小部件自己。如果你忘了一个,那么用户就是搞砸了。

恕我直言,除非有人指着你的头强迫你试图改变翻译而不发布新版本的应用程序,只需使用字符串资源并发布应用程序的新版本。


8
2018-01-11 16:23



所以当configChanges / activity发生变化时,没有“事件”可以订阅? - Micah
不,这一切都是由系统自动完成的! - Budius
@MicahL:“所以当configChanges / activity发生变化时,订阅没有”事件“?” - 就在这里。当你使用 android:configChanges,你还必须实施 onConfigurationChanged(),当列出任何配置更改时将调用 android:configChanges 发生。但是你必须自己更新一切。 - CommonsWare


答案:


是否可以在运行时将这些xml文件动态加载到应用程序中?

不,对不起

如果没有,是否可以覆盖UI xml和资源XML之间的绑定,以便我可以绑定到我自己的,动态加载的xml文件而不是res / values中的文件?

没什么 res/values/ 永远使用,除非你使用它。因此,没有什么可以“覆盖”。

例如,假设你有一个 TextView。您希望它显示一些文本。您希望该文本已本地化。通常,您将设置一系列字符串资源,每个翻译一个,然后使用这些字符串资源 TextView (例如。, android:text 在布局中,或 setText() 在Java)。在你的情况下,你不会设置字符串资源,但“做你自己的事情”,并打电话 setText() 如所须。

您在方法中失去的是自动转换。如果用户在您的应用程序运行时切换语言,Android会将其视为配置更改,并在返回到前台时重新启动您的活动。通常,这会自动加载新的字符串资源。在您的情况下,它不会,因为您没有使用字符串资源。相反,您需要告诉Android不要重新启动您的活动(通过 android:configChanges)并手动重新加载所有 TextView小部件自己。如果你忘了一个,那么用户就是搞砸了。

恕我直言,除非有人指着你的头强迫你试图改变翻译而不发布新版本的应用程序,只需使用字符串资源并发布应用程序的新版本。


8
2018-01-11 16:23



所以当configChanges / activity发生变化时,没有“事件”可以订阅? - Micah
不,这一切都是由系统自动完成的! - Budius
@MicahL:“所以当configChanges / activity发生变化时,订阅没有”事件“?” - 就在这里。当你使用 android:configChanges,你还必须实施 onConfigurationChanged(),当列出任何配置更改时将调用 android:configChanges 发生。但是你必须自己更新一切。 - CommonsWare


如果您愿意,可以重新发明轮子并实现自己的基于Locale的资源加载。

你可以得到最新的 语言环境 通过

Locale = context.getResources().getConfiguration().locale;

然后使用它的结果来适当加载你自己的字符串/ Drawables /等等。 当然,您必须以编程方式执行所有操作(XML布局不会自动使用正确的资源)。

我强烈建议坚持使用标准的本地化技术。


2
2018-01-11 16:29