使用字符串的Android头痛:如何集中我的应用程序中的所有字符串?

时间:2016-04-01 11:41:58

标签: java android xml string internationalization

我正在编写一个Android应用程序,所以我照常添加strings.xml所有字符串,并按照Android官方文档说明。

直到这里一切都很好,但是当我想在Java“标准”类中使用String时问题就出现了;即,在Email.java

中说出这个字符串
public static final String EMAIL_NOT_VALID = "The email address provided is not valid.";

您可以说我可以将此字符串放在strings.xml上并执行:

getResources().getString(R.string.invalid_email_message)

这种方法的问题在于我将被迫将Android上下文传递给我的应用程序中的每个Java对象,以及在测试时涉及的所有模拟问题。 < / p>

因此,是否可以在不传递上下文的情况下执行此操作?或者我是否需要有两个文件(strings.xmlxyz.java)和单独的字符串

我一直在StackOverFlow上搜索这个问题的答案而没有运气)

提前致谢。

3 个答案:

答案 0 :(得分:1)

请勿抓住您的字符串,尤其是代码类中的消息。决不。那时你无法将其翻译成其他语言。将字符串资源用于所有内容,可能除了您在调试器中看到的一些logmessages外。

你可以创建一个像Globals.java这样的类并放在那里

public static Context appContext;

并使用

在appStart(= MainActivity的“onCreate”)上填充此静态
Globals.appContext = getApplicationContext();

然后你到处都有一个Context。 只需确保,当您从后台返回时,您将刷新MainActivity的onResume事件中的上下文。

你在整个Android API中都看到了这个“问题” - SQLiteOpenHelper需要一个上下文...... 一切需要一个上下文。这是Android游戏的一部分。

答案 1 :(得分:1)

您可以尝试将字符串放在<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input type="file" id="file"/> <div id="uploadPreview"> </div>文件夹中,需要在assets内创建资源,您可以创建一个名为“本地化”的新文件夹,此处存储您的本地化文件,如{ {1}},在完成所有这些操作后,在此文件中将所有字符串存储在JSON对象YourProject/app/src/main/assets中,您需要创建一个将管理所有语言的类。

strings_en

然后在任何课程中,您都可以拨打"{"key" : "value"}。使用此方法,您需要在应用程序中添加“更改语言”选项,将值存储为public class LocalizationManager { private static LocalizationManager mInstance = null; public String currentLanguage = ""; JSONObject currentLanguageObject = new JSONObject(); private AssetManager assetManager = BaseApplication.getInstance().getAssets(); // BaseApplication is just a class that extends Application class private LocalizationManager() { } public static LocalizationManager getInstance() { if (mInstance == null) { mInstance = new LocalizationManager(); } return mInstance; } private boolean assetExists(String path) { boolean bAssetOk = false; try { InputStream stream = assetManager.open(path); stream.close(); bAssetOk = true; } catch (IOException e) { e.printStackTrace(); } return bAssetOk; } public String getLocalizedString(String string) { String language = BaseApplication.getInstance().getLanguage(); if (!currentLanguage.equalsIgnoreCase(language)) { if (assetExists("localization/strings_" + language)) { InputStream input; try { input = assetManager.open("localization/strings_" + language); int size = input.available(); byte[] buffer = new byte[size]; input.read(buffer); input.close(); String responseString = new String(buffer); Object json; try { json = new JSONTokener(responseString).nextValue(); if (json instanceof JSONObject) { currentLanguageObject = (JSONObject) json; currentLanguage = language; return currentLanguageObject.optString(string, string); } } catch (JSONException e) { return string; } } catch (IOException e) { return string; } } } else { return currentLanguageObject.optString(string, string); } return string; } } ,例如在首选项中,语言将动态更改。我是这样做的:

LocalizationManager.getInstance().getLocalizedString("Your string key")

答案 2 :(得分:0)

您可以使用:

Resources.getSystem().getString(android.R.string.somecommonstuff)

...应用程序中的任何地方,即使在静态常量声明中也是如此。不幸的是,它仅支持系统资源。

从堆栈溢出中的一个线程