2013-05-31 37 views
3

我的问题是所有文本都来自webservices。所以,在开始时,我调用webservice,并且必须在strings.xml中设置文本。我知道在strings.xml中编写这是不可能的,但是我们在iOs上遇到了同样的问题,并且在这里找到了解决方案http://iosapplove.com/archive/2013/01/localizable-strings-how-to-load-translations-dynamically-and-use-it-inside-your-iphone-app/android,从webservices中检索到的文本

所以我的问题是:在android上有类似的方式吗? (我认为不是)

它存在替代方式,如使用数据库或sharedPreferences但这些解决方案将不会非常有效。而且,该应用程序将包含许多语言。

所以我的第二个问题:做这件事的最好方法是什么?

+0

你真的确定你不能在应用程序中集成文本吗? – njzk2

+0

是的。这是来自客户的请求 – mrroboaat

+0

如果您从网络中检索它们,将它们存储为文本文件有什么问题?如果您不想使用数据库或共享首选项。 –

回答

0

正如您所知道的那样,APK.xml中不存在strings.xml文件。这意味着无法更改getResources()。getString(R.string.mystring)将返回的内容。

你说“这是来自客户的要求”。我的建议是,你告诉客户“这是一个坏主意”。因为它确实是。

如果客户坚持下去,我猜你唯一的选择就是以你需要的任何语言下载文本,并将它存储在你的应用程序外部文件存储中。建议使用properties文件很好。 Load it as an InputStreamget strings from it

您是否考虑过如果应用程序处于飞行模式或启动时没有可用网络会发生什么情况?你会提供默认值吗?

此外,使用此解决方案,您将无法在TextView中设置任何文本或XML中的类似文件,因为系统无法访问您在属性文件中下载的翻译。

如果你仍然继续这样做,我还建议你将属性文件包装到其他类中,如果文本不存在于属性文件中,则可以回退到strings.xml中的任何文本或者因为某种原因没有下载它:

class TextRetriever { 

    // the downloaded texts go here 
    private Properties properties; 

    private Context context; 

    public String getString(String key) { 
     String s = properties.getProperty(key); 
     // not found in properties file 
     if(s == null) { 
      // fall back to value in strings.xml 
      s = context.getResources().getIdentifier(key, "string", context.getPackageName()) 
     } 
     return s; 
    } 
}