语言选择

This commit is contained in:
fengjignqi
2026-06-06 15:25:52 +08:00
parent e9c17d355a
commit b621a77e8d
11 changed files with 245 additions and 24 deletions

View File

@@ -50,5 +50,7 @@ public class ConstantUtil {
/***************设备相关*******************/
//设备解绑成功广播
public static final String DEVICE_UNBIND_SUCCESS = "device_unbind_success";
//应用语言设置
public static final String KEY_APP_LANGUAGE = "key_app_language";
}

View File

@@ -16,6 +16,7 @@ import com.google.gson.Gson;
import com.ckkj.water.login.entity.LoginEntity;
import com.ckkj.water.network.NetWorkManager;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.LanguageManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import java.util.List;
@@ -67,6 +68,9 @@ public class MyApplication extends Application {
instance = this;
context = getApplicationContext();
// 恢复应用语言设置
applyStoredLocale();
boolean isUserAgreed = SharePreUtil.getBoolean(ConstantUtil.SHARE_PRE_NAME,context,ConstantUtil.PRIVACY_POLICY_AGREED);
if(isUserAgreed){
initializeUmengSDK();
@@ -178,4 +182,12 @@ public class MyApplication extends Application {
public static Context getContext() {
return context;
}
/**
* 应用启动时恢复保存的语言设置
* 使用 AppCompatDelegate.setApplicationLocales() API
*/
private void applyStoredLocale() {
LanguageManager.applyStoredLocale();
}
}

View File

@@ -22,6 +22,7 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.ckkj.water.utils.manager.LanguageManager;
import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig;
@@ -206,20 +207,24 @@ public class LoginActivity extends BaseActivity<LoginLayoutBinding, LoginPresent
break;
case R.id.tv_language:
new XPopup.Builder(mContext).asBottomList(
"选择语言",
new String[]{"中文", "English"},
new int[]{R.mipmap.icon_langage_chinese, R.mipmap.icon_langage_eng},
0,
new OnSelectListener() {
@Override
public void onSelect(int position, String text) {
ToastUtil.showShort(mContext,text);
}
},
R.layout.select_language_layout,
R.layout.select_language_item
).show();
new XPopup.Builder(mContext)
.isDestroyOnDismiss(true)
.dismissOnBackPressed(true)
.dismissOnTouchOutside(true)
.asBottomList(
getString(R.string.change_language),
LanguageManager.getLanguageDisplayNames(mContext),
LanguageManager.getLanguageIcons(),
LanguageManager.getCurrentLanguageIndex(),
new OnSelectListener() {
@Override
public void onSelect(int position, String text) {
LanguageManager.switchLanguageByIndex(position, LoginActivity.this);
}
},
R.layout.select_language_layout,
R.layout.select_language_item
).show();
break;
case R.id.tv_reset_psd ://重置密码

View File

@@ -2,6 +2,7 @@ package com.ckkj.water.mine;
import static android.view.View.INVISIBLE;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
@@ -22,6 +23,7 @@ import com.ckkj.water.mine.mvp.MinePresenter;
import com.ckkj.water.network.BaseBean;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.ActivityManager;
import com.ckkj.water.utils.manager.LanguageManager;
import com.ckkj.water.utils.manager.ThemeManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager;
import com.ckkj.water.utils.show.ToastUtil;
@@ -92,14 +94,14 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
.dismissOnBackPressed(true)
.dismissOnTouchOutside(true)
.asBottomList(
"选择语言",
new String[]{"中文", "English"},
new int[]{R.mipmap.icon_langage_chinese, R.mipmap.icon_langage_eng},
0,
getString(R.string.change_language),
LanguageManager.getLanguageDisplayNames(mContext),
LanguageManager.getLanguageIcons(),
LanguageManager.getCurrentLanguageIndex(),
new OnSelectListener() {
@Override
public void onSelect(int position, String text) {
ToastUtil.showShort(mContext,text);
LanguageManager.switchLanguageByIndex(position, getActivity());
}
},
R.layout.select_language_layout,

View File

@@ -0,0 +1,187 @@
package com.ckkj.water.utils.manager;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.os.LocaleListCompat;
import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.MyApplication;
import com.ckkj.water.R;
import com.ckkj.water.login.LoginActivity;
import com.ckkj.water.main.activity.MainActivity;
import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.show.ToastUtil;
/**
* 语言切换管理工具类
* 使用 AppCompatDelegate.setApplicationLocales() API 实现中英切换
*/
public class LanguageManager {
private static final String TAG = "LanguageManager";
/**
* 语言类型枚举
*/
public enum LanguageType {
CHINESE(0, "zh", "中文"),
ENGLISH(1, "en", "English");
public final int index;
public final String languageTag;
public final String displayName;
LanguageType(int index, String languageTag, String displayName) {
this.index = index;
this.languageTag = languageTag;
this.displayName = displayName;
}
public static LanguageType fromIndex(int index) {
for (LanguageType type : values()) {
if (type.index == index) {
return type;
}
}
return CHINESE;
}
public static LanguageType fromLanguageTag(String languageTag) {
if ("en".equals(languageTag)) {
return ENGLISH;
}
return CHINESE;
}
}
/**
* 获取当前语言类型
*/
public static LanguageType getCurrentLanguageType() {
LocaleListCompat locales = AppCompatDelegate.getApplicationLocales();
if (locales.isEmpty()) {
return LanguageType.CHINESE;
}
String language = locales.get(0).getLanguage();
return LanguageType.fromLanguageTag(language);
}
/**
* 获取当前语言索引 (0: 中文, 1: 英文)
*/
public static int getCurrentLanguageIndex() {
return getCurrentLanguageType().index;
}
/**
* 切换语言
* @param languageType 要切换到的语言类型
*/
public static void switchLanguage(LanguageType languageType) {
switchLanguage(languageType, null);
}
/**
* 切换语言并重启应用
* @param languageType 要切换到的语言类型
* @param activity 触发切换的Activity用于重启
*/
public static void switchLanguage(LanguageType languageType, Activity activity) {
// 先保存语言设置
saveLanguage(languageType.languageTag);
// 设置应用语言
LocaleListCompat localeList = LocaleListCompat.forLanguageTags(languageType.languageTag);
AppCompatDelegate.setApplicationLocales(localeList);
// 如果传入了Activity则重启应用
if (activity != null) {
ToastUtil.showShort(activity, activity.getString(R.string.language_switch_success));
// 延迟重启应用,确保语言设置生效
new android.os.Handler(android.os.Looper.getMainLooper()).postDelayed(() -> {
try {
boolean isLogin = AppConfig.USER_LOGIN || SharePreUtil.getBoolean(
ConstantUtil.SHARE_PRE_NAME,
activity,
ConstantUtil.USER_LOGIN
);
ActivityManager.removeAllActivity();
Intent intent = new Intent(activity, isLogin ? MainActivity.class : LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
activity.startActivity(intent);
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}, 500);
}
}
/**
* 切换语言(通过索引)
* @param position 0: 中文, 1: 英文
*/
public static void switchLanguageByIndex(int position) {
switchLanguage(LanguageType.fromIndex(position), null);
}
/**
* 切换语言并重启应用(通过索引)
* @param position 0: 中文, 1: 英文
* @param activity 触发切换的Activity
*/
public static void switchLanguageByIndex(int position, Activity activity) {
switchLanguage(LanguageType.fromIndex(position), activity);
}
/**
* 保存语言设置到本地
*/
public static void saveLanguage(String languageTag) {
SharePreUtil.putString(ConstantUtil.SHARE_PRE_NAME,
MyApplication.getContext(),
ConstantUtil.KEY_APP_LANGUAGE,
languageTag);
}
/**
* 应用启动时恢复保存的语言设置
* 应该在 Application.onCreate() 中调用
*/
public static void applyStoredLocale() {
String savedLocale = SharePreUtil.getString(
ConstantUtil.SHARE_PRE_NAME,
MyApplication.getContext(),
ConstantUtil.KEY_APP_LANGUAGE);
if (savedLocale != null && !savedLocale.isEmpty()) {
LocaleListCompat localeList = LocaleListCompat.forLanguageTags(savedLocale);
AppCompatDelegate.setApplicationLocales(localeList);
}
}
/**
* 获取语言选择列表的显示文本
*/
public static String[] getLanguageDisplayNames(Context context) {
return new String[]{
context.getString(R.string.language_chinese),
context.getString(R.string.language_english)
};
}
/**
* 获取语言选择列表的图标资源ID
*/
public static int[] getLanguageIcons() {
return new int[]{
R.mipmap.icon_langage_chinese,
R.mipmap.icon_langage_eng
};
}
}