- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 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 对象,并在测试时涉及到所有模拟问题。
因此,是否可以在不传递上下文的情况下执行此操作?或者我是否需要有两个文件(strings.xml
和 xyz.java
)以及单独的字符串?
我在 StackOverFlow 上搜索了几个小时这个问题的答案,但没有运气)
提前致谢。
最佳答案
您可以尝试将字符串放在 assets
文件夹中,它需要在 YourProject/app/src/main/assets
内的 asset 中创建,您可以创建一个新的名为“localization”的文件夹,此处存储您的本地化文件,如 strings_en
,在此文件中将所有字符串存储在 JSON 对象中 "{"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")
。使用这种方法,您需要在应用程序中添加“更改语言”选项,例如在首选项中将值存储为 en
,并且语言将动态更改。我是这样做的:
public void setLanguage(String language) {
mPreferences = getSharedPreferences(LANGUAGE_KEY_FOR_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = mPreferences.edit();
editor.putString("Language", language);
editor.apply();
mListener.onLanguageChanged();
}
public String getLanguage() {
mPreferences = getSharedPreferences(LANGUAGE_KEY_FOR_PREFS, MODE_PRIVATE);
return mPreferences.getString("Language", "en");
}
关于java - Android 字符串问题 : How can I centralize all strings within my app?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355458/
我是一名优秀的程序员,十分优秀!