我正在编写一个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.xml
和xyz.java
)和单独的字符串?
我一直在StackOverFlow上搜索这个问题的答案而没有运气)
提前致谢。
答案 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)
...应用程序中的任何地方,即使在静态常量声明中也是如此。不幸的是,它仅支持系统资源。
从堆栈溢出中的一个线程