1每一个Activity都继承BaseActivity,核心
changeLanguage(SPUtils.getLocalLanguage());
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppManager.getInstance().addActivity(this);
changeLanguage(SPUtils.getLocalLanguage());
}
private void changeLanguage(String language) {
Resources res = getResources();
Configuration config = res.getConfiguration();
DisplayMetrics dm = res.getDisplayMetrics();
switch (language) {
case "en":
config.locale = Locale.ENGLISH;
res.updateConfiguration(config, dm);
break;
case "ch":
config.locale = Locale.CHINESE;
res.updateConfiguration(config, dm);
break;
}
}
@Override
protected void onDestroy() {
AppManager.getInstance().removeActivity(this);
super.onDestroy();
}
@Override
protected void attachBaseContext(Context context) {
/*
方案二 不生效。
*/
// LanguageContextWrapper.wrapper(context);
super.attachBaseContext(context);
}
}
2触发类
核心
SPUtils.saveLocalLanguage("en");
package io.winkong.marinsmart.activity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import java.util.Locale;
import io.winkong.marinsmart.R;
import io.winkong.marinsmart.utils.AppManager;
import io.winkong.marinsmart.utils.LanguageContextWrapper;
import io.winkong.marinsmart.utils.SPUtils;
public class SystemLanguageActivity extends BaseActivity implements View.OnClickListener {
private TextView backTv;
private TextView titleBart;
private TextView sureTv;
private CheckBox zwCb;
private CheckBox enCb;
String currentLanguage = "zh";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_system_language);
init();
}
private void init() {
backTv = findViewById(R.id.back_tv);
titleBart = findViewById(R.id.title_bart);
sureTv = findViewById(R.id.sure_tv);
zwCb = findViewById(R.id.zw_cb);
enCb = findViewById(R.id.en_cb);
titleBart.setText(getResources().getString(R.string.SystemLanguage));
backTv.setOnClickListener(this);
sureTv.setOnClickListener(this);
zwCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
enCb.setChecked(false);
}
}
});
enCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
zwCb.setChecked(false);
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back_tv:
finish();
break;
case R.id.sure_tv:
if (enCb.isChecked()) {
SPUtils.saveLocalLanguage("en");
} else if (zwCb.isChecked()) {
SPUtils.saveLocalLanguage("ch");
}
AppManager.getInstance().finishAllActivity();
Intent intent = new Intent(SystemLanguageActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
break;
}
}
public void switchLang() {
// LanguageUtils.applyLanguage(Locale.ENGLISH, String.valueOf(true));
// LanguageUtils.applyLanguage(Locale.ENGLISH, (Class<? extends Activity>) null);
String currentLanguage = Locale.getDefault().getLanguage();
Log.e("wy", "currentLanguage: " + currentLanguage);
if (currentLanguage.equals("en")) {
Locale.setDefault(Locale.CHINESE);
Configuration configuration = getResources().getConfiguration();
configuration.locale = Locale.CHINESE;
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
recreate();
} else {
Locale.setDefault(Locale.ENGLISH);
Configuration configuration = getResources().getConfiguration();
configuration.locale = Locale.ENGLISH;
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());
recreate();
}
Log.e("wy", "Attach: " + getResources().getString(R.string.SystemLanguage));
}
public void switchLang(Context context) {
// LanguageUtils.applyLanguage(Locale.ENGLISH, String.valueOf(true));
// LanguageUtils.applyLanguage(Locale.ENGLISH, (Class<? extends Activity>) null);
String currentLanguage = Locale.getDefault().getLanguage();
Log.e("wy", "currentLanguage: " + currentLanguage);
if (currentLanguage.equals("en")) {
Locale.setDefault(Locale.CHINESE);
Configuration configuration = context.getResources().getConfiguration();
configuration.locale = Locale.CHINESE;
context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());
recreate();
} else {
Locale.setDefault(Locale.ENGLISH);
Configuration configuration = context.getResources().getConfiguration();
configuration.locale = Locale.ENGLISH;
context.getResources().updateConfiguration(configuration, context.getResources().getDisplayMetrics());
recreate();
}
Log.e("wy", "Attach: " + context.getResources().getString(R.string.SystemLanguage));
}
}
SPUtils
核心
configSharedPreferences.edit().putString(LOCAL_LANGUAGE, language).apply();
package io.winkong.marinsmart.utils;
import android.content.Context;
import android.content.SharedPreferences;
public class SPUtils {
private static final String LOCAL_LANGUAGE = "language";//本地语言
private static SPUtils instance;
private static SharedPreferences configSharedPreferences;
private SPUtils(Context context) {
configSharedPreferences = context.getSharedPreferences("config", Context.MODE_PRIVATE);
}
public static SPUtils getInstance(Context context) {
if (instance == null) {
synchronized (SPUtils.class) {
if (instance == null) {
instance = new SPUtils(context);
}
}
}
return instance;
}
public static String getLocalLanguage() {
return configSharedPreferences.getString(LOCAL_LANGUAGE, "default");
}
public static void saveLocalLanguage(String language) {
configSharedPreferences.edit().putString(LOCAL_LANGUAGE, language).apply();
}
}
activity_system_language.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="io.winkong.marinsmart.activity.SystemLanguageActivity">
<include layout="@layout/titlebar_include" />
<LinearLayout
android:background="@drawable/nickname_shape"
android:orientation="vertical"
android:layout_marginLeft="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:paddingLeft="26dp"
android:paddingTop="18dp"
android:layout_marginRight="23dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:textSize="16sp"
android:text="@string/Chinese"
android:layout_weight="1"
android:textColor="@color/black_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/zw_cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:paddingLeft="26dp"
android:paddingTop="18dp"
android:layout_marginRight="23dp"
android:layout_marginBottom="17dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/English"
android:textColor="@color/black_title"
android:textSize="16sp" />
<CheckBox
android:id="@+id/en_cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/sure_tv"
android:text="确定"
android:layout_marginTop="24dp"
android:textColor="@color/white"
android:gravity="center"
android:layout_gravity="center"
android:background="@drawable/sure_background_shape"
android:layout_width="131dp"
android:layout_height="43dp" />
</LinearLayout>