语言选择
This commit is contained in:
4
.idea/deploymentTargetSelector.xml
generated
4
.idea/deploymentTargetSelector.xml
generated
@@ -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>
|
||||||
|
|||||||
@@ -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'//微信官方依赖库,必选
|
||||||
//商品评价星星
|
//商品评价星星
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
5
app/src/main/res/xml/locale_config.xml
Normal file
5
app/src/main/res/xml/locale_config.xml
Normal 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>
|
||||||
Reference in New Issue
Block a user