碎碎念
我在寫app的時候,無論是布局上的字符串還是代碼中的,我都喜歡直接敲上去,無視那個善意提醒的波浪線。
對於小項目來說,我覺得無可厚非,雖然不規范但方便直觀,不需要苦於給字符串起名字。
如果你在項目初期就想着要將應用推向國際市場,就要注意字符串一定要養成習慣全部寫在string.xml里,不然后期再加真的很崩潰。
創建多語言的string.xml
我們的目標是,應用跟隨系統語言改變而改變。
首先是創建對應的語言的string.xml文件。
選中res/values文件夾,右鍵新建一個資源文件。
然后選擇Locale類別,添加進來,名稱就叫string.xml
然后選擇對應的語言,地區選擇全部
這樣你就得到了兩份string.xml文件,一份是原版的即中文,另一份是英文的對照版本。
在中文的中創建一個字符串,會有相應的提示需要在英文對照版本中創建一份翻譯的版本。
如何使用
在布局中可以直接使用@string形式來加載,在代碼中使用:
/** * 加載字符串 * @param id 字符串id * */ public static String getStaticString(Context context,int id){ return context.getResources().getString(id); }
自動切換
為了實現自動切換功能,我們需要封裝一個LanguageUtil(參考自 簡書)
import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Build; import android.util.DisplayMetrics; import com.google.gson.Gson; import java.util.Locale; public class LanguageUtil { private static final String LOCALE_SP = "LOCALE_SP"; private static final String LOCALE_SP_KEY = "LOCALE_SP_KEY"; public static Locale getLocale(Context context) { SharedPreferences spLocale = context.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE); String localeJson = spLocale.getString(LOCALE_SP_KEY, ""); Gson gson = new Gson(); return gson.fromJson(localeJson, Locale.class); } private static void setLocale(Context pContext, Locale pUserLocale) { SharedPreferences spLocal = pContext.getSharedPreferences(LOCALE_SP, Context.MODE_PRIVATE); SharedPreferences.Editor edit = spLocal.edit(); String json = new Gson().toJson(pUserLocale); edit.putString(LOCALE_SP_KEY, json); edit.apply(); } public static boolean updateLocale(Context context, Locale locale) { if (needUpdateLocale(context, locale)) { Configuration configuration = context.getResources().getConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { configuration.setLocale(locale); } else { configuration.locale = locale; } DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); context.getResources().updateConfiguration(configuration, displayMetrics); setLocale(context, locale); return true; } return false; } public static boolean needUpdateLocale(Context pContext, Locale newUserLocale) { return newUserLocale != null && !getCurrentLocale(pContext).equals(newUserLocale); } public static Locale getCurrentLocale(Context context) { Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多語言設置獲取頂部的語言 locale = context.getResources().getConfiguration().getLocales().get(0); } else { locale = context.getResources().getConfiguration().locale; } return locale; } }
緊接着我們創建一個Application來自動加載
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); languageWork(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); languageWork(); } private void languageWork() { Locale locale = LanguageUtil.getLocale(this); LanguageUtil.updateLocale(this, locale); } }
在AndroidManifest.xml中配置一下:
android:name=".MyApplication"
如圖所示:
愉快的去使用吧~