国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

App內切換語言詳解

2019-10-23 18:30:19
字體:
來源:轉載
供稿:網友

前幾天客戶提需求,對App增加一個功能,這個功能目前市面上已經很常見,那就是應用內切換語言。啥意思,就是 英、中、法、德、日。。。語言隨意切換。

(本案例采用Data-Bingding模式,麻麻再也不用擔心我findViewBy不到Id了哈哈,開個玩笑)

先上示例圖:

app,切換語言,app語言切換

代碼實現:

布局文件(Data-Binding模式),很簡單就是兩行文字

<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"tools:context="com.tnnowu.android.switchlanguage.MainActivity"> <TextView android:id="@+id/titleTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="@string/title" android:textSize="30sp" android:textStyle="bold" /> <TextView android:id="@+id/descTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/titleTextView" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:text="@string/desc" android:textSize="20sp" /> </RelativeLayout></layout>

從實例中我們可以看到右上角是有Menu

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/language_english" android:orderInCategory="100" android:title="@string/menu_english" /> <item android:id="@+id/language_simplified_chinese" android:orderInCategory="100" android:title="@string/menu_simplified_chinese" /> <item android:id="@+id/language_turkish" android:orderInCategory="100" android:title="@string/menu_turkish" /> <item android:id="@+id/language_japanese" android:orderInCategory="100" android:title="@string/menu_japanese" /></menu>

(既然是多語言,所以就要有N個strings)

app,切換語言,app語言切換

本案例我創建了4種語言。

好的,Menu的布局寫完了,接下來就是實現Menu功能,記住實現Menu就兩套代碼,一個 onCreateOptionsMenu , 另一個是 onOptionsItemSelected 。

@Overridepublic boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.language_english) { updateViews("en"); } else if (id == R.id.language_simplified_chinese) { updateViews("zh"); } else if (id == R.id.language_turkish) { updateViews("tr"); } else if (id == R.id.language_japanese) { updateViews("ja"); } return super.onOptionsItemSelected(item);}

在這里,可以看到,我們自定義一個 updateViews() 方法,用來實現切換預言時界面的改變

private void updateViews(String languageCode) { Context context = LocaleHelper.setLocale(this, languageCode); Resources resources = context.getResources(); mBinding.titleTextView.setText(resources.getString(R.string.title)); mBinding.descTextView.setText(resources.getString(R.string.desc)); setTitle(resources.getString(R.string.toolbar_title));}

公布一個 語言判斷的類 LocaleHelper

public class LocaleHelper { private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language"; public static Context onAttach(Context context) { String lang = getPersistedData(context, Locale.getDefault().getLanguage()); return setLocale(context, lang); } public static Context onAttach(Context context, String defaultLanguage) { String lang = getPersistedData(context, defaultLanguage); return setLocale(context, lang); } public static String getLanguage(Context context) { return getPersistedData(context, Locale.getDefault().getLanguage()); } public static Context setLocale(Context context, String language) { persist(context, language); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  return updateResources(context, language); } return updateResourcesLegacy(context, language); } private static String getPersistedData(Context context, String defaultLanguage) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); return preferences.getString(SELECTED_LANGUAGE, defaultLanguage); } private static void persist(Context context, String language) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = preferences.edit(); editor.putString(SELECTED_LANGUAGE, language); editor.apply(); } @TargetApi(Build.VERSION_CODES.N) private static Context updateResources(Context context, String language) { Locale locale = new Locale(language); Locale.setDefault(locale); Configuration configuration = context.getResources().getConfiguration(); configuration.setLocale(locale); return context.createConfigurationContext(configuration); } @SuppressWarnings("deprecation") private static Context updateResourcesLegacy(Context context, String language) { Locale locale = new Locale(language); Locale.setDefault(locale); Resources resources = context.getResources(); Configuration configuration = resources.getConfiguration(); configuration.locale = locale; resources.updateConfiguration(configuration, resources.getDisplayMetrics()); return context; }}

最后還要做的操作就是,自定義一個Application類,用來設定App的默認語言(當然了,要將這個Application應用到Manifest中)

public class BaseApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(LocaleHelper.onAttach(base, "en")); }}

本案例實現App內語言切換代碼量不大,通俗易懂,無垃圾代碼。

示例代碼下載地址:App內切換語言

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都匀市| 西乡县| 新干县| 综艺| 双峰县| 湘潭县| 江永县| 尉犁县| 盘山县| 浮梁县| 宁陵县| 确山县| 福清市| 内江市| 宜兰县| 蓝田县| 钟山县| 大丰市| 乌兰察布市| 万盛区| 古丈县| 保德县| 依安县| 阳山县| 台湾省| 石景山区| 南和县| 东海县| 临朐县| 双峰县| 海伦市| 衡水市| 临猗县| 康乐县| 姚安县| 邵武市| 和政县| 墨竹工卡县| 工布江达县| 莱州市| 奉贤区|