语言选择

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

@@ -4,10 +4,10 @@
<selectionStates> <selectionStates>
<SelectionState runConfigName="app"> <SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" /> <option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-06-06T06:02:40.456417500Z"> <DropdownSelection timestamp="2026-06-06T06:46:42.891310900Z">
<Target type="DEFAULT_BOOT"> <Target type="DEFAULT_BOOT">
<handle> <handle>
<DeviceId pluginId="LocalEmulator" identifier="path=C:\Users\Admin\.android\avd\Pixel_9a.avd" /> <DeviceId pluginId="PhysicalDevice" identifier="serial=D122222104A9" />
</handle> </handle>
</Target> </Target>
</DropdownSelection> </DropdownSelection>

View File

@@ -174,7 +174,7 @@ dependencies {
implementation 'com.github.ns3chz:Picker:1.0.2' implementation 'com.github.ns3chz:Picker:1.0.2'
implementation 'com.github.zzy0516alex:FileSelectorRelease:v6.2' implementation 'com.github.zzy0516alex:FileSelectorRelease:v6.2'
implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'androidx.appcompat:appcompat:1.3.1'//(最低版本) implementation 'androidx.appcompat:appcompat:1.6.1'//(最低版本)
// implementation 'com.umeng.umsdk:share-wx:7.1.5' //微信完整版 // implementation 'com.umeng.umsdk:share-wx:7.1.5' //微信完整版
// implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.0'//微信官方依赖库,必选 // implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.0'//微信官方依赖库,必选
//商品评价星星 //商品评价星星

View File

@@ -71,7 +71,9 @@
android:theme="@style/custom_app_theme" android:theme="@style/custom_app_theme"
android:supportsRtl="true" android:supportsRtl="true"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:networkSecurityConfig="@xml/network_security_config"> android:networkSecurityConfig="@xml/network_security_config"
android:localeConfig="@xml/locale_config"
tools:replace="android:localeConfig">
<!-- 高德地图 --> <!-- 高德地图 -->
<meta-data android:name="com.amap.api.v2.apikey" android:value="a91364c6bbc2f5c773a949926fae7fb6"> <meta-data android:name="com.amap.api.v2.apikey" android:value="a91364c6bbc2f5c773a949926fae7fb6">
</meta-data> </meta-data>

View File

@@ -50,5 +50,7 @@ public class ConstantUtil {
/***************设备相关*******************/ /***************设备相关*******************/
//设备解绑成功广播 //设备解绑成功广播
public static final String DEVICE_UNBIND_SUCCESS = "device_unbind_success"; 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.login.entity.LoginEntity;
import com.ckkj.water.network.NetWorkManager; import com.ckkj.water.network.NetWorkManager;
import com.ckkj.water.utils.dataUtil.SharePreUtil; import com.ckkj.water.utils.dataUtil.SharePreUtil;
import com.ckkj.water.utils.manager.LanguageManager;
import com.ckkj.water.utils.manager.WaterUserInfoManager; import com.ckkj.water.utils.manager.WaterUserInfoManager;
import java.util.List; import java.util.List;
@@ -67,6 +68,9 @@ public class MyApplication extends Application {
instance = this; instance = this;
context = getApplicationContext(); context = getApplicationContext();
// 恢复应用语言设置
applyStoredLocale();
boolean isUserAgreed = SharePreUtil.getBoolean(ConstantUtil.SHARE_PRE_NAME,context,ConstantUtil.PRIVACY_POLICY_AGREED); boolean isUserAgreed = SharePreUtil.getBoolean(ConstantUtil.SHARE_PRE_NAME,context,ConstantUtil.PRIVACY_POLICY_AGREED);
if(isUserAgreed){ if(isUserAgreed){
initializeUmengSDK(); initializeUmengSDK();
@@ -178,4 +182,12 @@ public class MyApplication extends Application {
public static Context getContext() { public static Context getContext() {
return context; 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.annotation.NonNull;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.ckkj.water.utils.manager.LanguageManager;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.gyf.immersionbar.ImmersionBar; import com.gyf.immersionbar.ImmersionBar;
import com.ckkj.water.AppConfig; import com.ckkj.water.AppConfig;
@@ -206,15 +207,19 @@ public class LoginActivity extends BaseActivity<LoginLayoutBinding, LoginPresent
break; break;
case R.id.tv_language: case R.id.tv_language:
new XPopup.Builder(mContext).asBottomList( new XPopup.Builder(mContext)
"选择语言", .isDestroyOnDismiss(true)
new String[]{"中文", "English"}, .dismissOnBackPressed(true)
new int[]{R.mipmap.icon_langage_chinese, R.mipmap.icon_langage_eng}, .dismissOnTouchOutside(true)
0, .asBottomList(
getString(R.string.change_language),
LanguageManager.getLanguageDisplayNames(mContext),
LanguageManager.getLanguageIcons(),
LanguageManager.getCurrentLanguageIndex(),
new OnSelectListener() { new OnSelectListener() {
@Override @Override
public void onSelect(int position, String text) { public void onSelect(int position, String text) {
ToastUtil.showShort(mContext,text); LanguageManager.switchLanguageByIndex(position, LoginActivity.this);
} }
}, },
R.layout.select_language_layout, R.layout.select_language_layout,

View File

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

View File

@@ -8,7 +8,10 @@
<string name="get_verifi_code">获取验证码</string> <string name="get_verifi_code">获取验证码</string>
<string name="btn_login">登录</string> <string name="btn_login">登录</string>
<string name="go_register">立即注册</string> <string name="go_register">立即注册</string>
<string name="change_language">语言选择</string> <string name="change_language">Language</string>
<string name="language_chinese">中文</string>
<string name="language_english">English</string>
<string name="language_switch_success">Language changed</string>
<string name="reset_psd">忘记密码</string> <string name="reset_psd">忘记密码</string>
<string name="hint_input_old_psd">请输入原密码</string> <string name="hint_input_old_psd">请输入原密码</string>
<string name="hint_input_psd">请输入密码</string> <string name="hint_input_psd">请输入密码</string>

View File

@@ -9,6 +9,9 @@
<string name="btn_login">登录</string> <string name="btn_login">登录</string>
<string name="go_register">立即注册</string> <string name="go_register">立即注册</string>
<string name="change_language">语言选择</string> <string name="change_language">语言选择</string>
<string name="language_chinese">中文</string>
<string name="language_english">English</string>
<string name="language_switch_success">语言切换成功</string>
<string name="reset_psd">忘记密码</string> <string name="reset_psd">忘记密码</string>
<string name="hint_input_psd">请输入密码</string> <string name="hint_input_psd">请输入密码</string>
<string name="hint_input_old_psd">请输入原密码</string> <string name="hint_input_old_psd">请输入原密码</string>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
<locale android:name="zh" />
<locale android:name="en" />
</locale-config>