功能: app用户根据本身的语言喜爱,设置app语言。语言设置只针对本app,并在下次启动应用时保留前一次启动设置。 更新语言: <!-- lang: java --> public static void changeAppLanguage(Resources resources, String lanAtr) { Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); if (lanAtr.equals("ru_RU")) { config.locale = new Locale("ru", "RU"); } else if (lanAtr.equals("en_US")) { config.locale = Locale.ENGLISH; } else if (lanAtr.equals("pt")) { config.locale = new Locale("pt"); } else { config.locale = Locale.getDefault(); } resources.updateConfiguration(config, dm); } sharePreferences存入设置语言: <!-- lang: java --> Sharences sharedPreferences = getActivity().getSharedPrefeivity().getPackageName(), 0); sharedPreferences.edit().putString("language", lanAtr).commit(); 语言更新后,对于以前出现且目前仍旧存活的activity,语言设置是不生效的。能够经过重启对应的activity,让语言及时生效。 <!-- lang: java --> private void restart() { Intent it = new Intent(getActivity(), MainActivity.class); //MainActivity是你想要重启的activity it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); getActivity().startActivity(it); } NOTE: 通常,从用户体验角度讲,语言设置功能入口会放在App的前几层,若是入口太深,致使用户没法快速找到语言设置入口,而且若是要讲应用重启的话,用户行为操做记录会比较麻烦。 重启对应Activity有几种方式: 若是用户进入语言设置须要太多的层级,或者在操做语言设置以前操做的其余行为,APP想保存的,那能够经过广播的方式(sendBroadcast()),语言改变时发送广播,全部activity接受到广播后(BroadcastReceiver),都进行重启操做; 若是容许用户设置语言后,app回到主目录,这样就简单不少,直接调用上面的restart()方法便可。java
重启singleTask activity: 若是你的启动activity是singleTask,向上面那样重启,语言仍是不生效的。这种状况如何呢?能够经过了解、利用其生命周期来解决,在切回singleTask属性的activity时,activity会调用onNewIntent()方法。 重写该方法就能够。如下是一种解决方法,先finish本身,而后重启本身。 <!-- lang: java --> @Override protected void onNewIntent(Intent intent) { if (intent.getAction() == null) { finish(); Intent i = new Intent(this, MainActivity.class); startActivity(i); // overridePendingTransition(0, 0); } else { //其余逻辑 } } 结束语: APP语言设置不复杂,主要是如何将语言设置及时生效,涉及activity重启,广播等。app