APP中针对不同国家不同地区的人群使用那么应用的语言自然也要能够随时进行切换,最近做的项目有中文和英文切换的需求,所以在了解了一下网上常用的方法后记录一下我使用的方法,只是简单的应用,后续如果有不同需求需要自己去改。♻
一、Android Studio新建工程
新建工程就不过多赘述了,建好之后记得运行一下,看看是否建立的正确,养成良好习惯。
二、添加对应语言的配置文件
在res目录下新建一个对应语言的配置文件(这里以英文为例)。
好,建立好配置文件后外面可以看看res目录下就多了values-en文件夹。
然后点击进去这个英文的配置文件,将默认中文中的字符定义全部复制过来替换成英文。
原默认中文文件:
需要切换的英文文件:
接下来定义一下主界面的UI,随便写了几个按键做测试。
代码:
<?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:layout_width="match_parent"android:padding="0dp"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_marginTop="20dp"android:orientation="vertical"android:layout_height="wrap_content"><Buttonandroid:layout_width="wrap_content"android:text="@string/btn_test1"android:layout_margin="5dp"android:layout_height="wrap_content"/><Buttonandroid:layout_width="wrap_content"android:text="@string/btn_test2"android:layout_margin="5dp"android:layout_height="wrap_content"/><Buttonandroid:layout_width="wrap_content"android:text="@string/btn_test3"android:layout_margin="5dp"android:layout_height="wrap_content"/><Buttonandroid:layout_width="wrap_content"android:text="@string/btn_test4"android:layout_margin="5dp"android:layout_height="wrap_content"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:orientation="vertical"android:layout_marginTop="200dp"android:layout_height="wrap_content"><Buttonandroid:id="@+id/language1"android:layout_width="match_parent"android:text="切换中文"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/language2"android:layout_width="match_parent"android:text="切换英文"android:layout_height="wrap_content"/></LinearLayout></LinearLayout>
三、添加语言切换与保存的工具
添加两个 LanguageUtil、SpUserUtils java类文件。
LanguageUtil 代码:
package com.example.my_language_test3;import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;import org.apache.commons.lang3.StringUtils;import java.util.HashMap;
import java.util.Locale;/*** 功能描述:修改app内部的语言工具类*/
public class LanguageUtil {/*语言类型:* 此处支持3种语言类型,更多可以自行添加。* */private static final String ENGLISH = "en";private static final String CHINESE = "ch";private static final String TRADITIONAL_CHINESE = "zh_rTW";private static HashMap<String, Locale> languagesList = new HashMap<String, Locale>(3) {{put(ENGLISH, Locale.ENGLISH);put(CHINESE, Locale.CHINESE);put(TRADITIONAL_CHINESE, Locale.TRADITIONAL_CHINESE);}};/*** 修改语言** @param activity 上下文* @param language 例如修改为 英文传“en”,参考上文字符串常量* @param cls 要跳转的类(一般为入口类)*/public static void changeAppLanguage(Activity activity, String language, Class<?> cls) {Resources resources = activity.getResources();Configuration configuration = resources.getConfiguration();// app locale 默认简体中文Locale locale = getLocaleByLanguage(StringUtils.isEmpty(language) ? "zh" : language);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {configuration.setLocale(locale);} else {configuration.locale = locale;}DisplayMetrics dm = resources.getDisplayMetrics();resources.updateConfiguration(configuration, dm);Log.e("Log","设置的语言:" + language);//finish();// 重启appIntent intent = new Intent(activity, cls);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);activity.startActivity(intent);//加载动画//activity.overridePendingTransition(R.anim.anim_right_in, R.anim.anim_left_out);//activity.overridePendingTransition(0, 0);}/*** 获取指定语言的locale信息,如果指定语言不存在* 返回本机语言,如果本机语言不是语言集合中的一种,返回英语*/private static Locale getLocaleByLanguage(String language) {if (isContainsKeyLanguage(language)) {return languagesList.get(language);} else {Locale locale = Locale.getDefault();for (String key : languagesList.keySet()) {if (TextUtils.equals(languagesList.get(key).getLanguage(), locale.getLanguage())) {return locale;}}}return Locale.ENGLISH;}/*** 如果此映射包含指定键的映射关系,则返回 true*/private static boolean isContainsKeyLanguage(String language) {return languagesList.containsKey(language);}}
SpUserUtils 代码:
package com.example.my_language_test3;import android.content.Context;
import android.content.SharedPreferences;public class SpUserUtils {private static SharedPreferences sp;private static SharedPreferences getSp(Context context) {if (sp == null) {sp = context.getSharedPreferences("SpUtil", Context.MODE_PRIVATE);}return sp;}/*** 存入字符串** @param context 上下文* @param key 字符串的键* @param value 字符串的值*/public static void putString(Context context, String key, String value) {SharedPreferences preferences = getSp(context);//存入数据SharedPreferences.Editor editor = preferences.edit();editor.putString(key, value);editor.commit();}/*** 获取字符串** @param context 上下文* @param key 字符串的键* @return 得到的字符串*/public static String getString(Context context, String key) {SharedPreferences preferences = getSp(context);return preferences.getString(key, "");}/*** 清除String* @param context* @param key*/public static void clearString(Context context, String key) {SharedPreferences sp = getSp(context);SharedPreferences.Editor editor = sp.edit();editor.remove(key);editor.apply();
// editor.clear();
// editor.commit();}
}
注意: 如果 LanguageUtil 类中的 StringUtils 没有添加依赖的话需要自行添加。
在build.gradle中添加依赖 ‘implementation 'org.apache.commons:commons-lang3:3.7'
implementation 'org.apache.commons:commons-lang3:3.7'
随后在 MainActivity 中实现功能。
package com.example.mylanguage_test;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button language1,language2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);language1 = findViewById(R.id.language1);language2 = findViewById(R.id.language2);language1.setOnClickListener(this);language2.setOnClickListener(this);}@SuppressLint("NonConstantResourceId")public void onClick(View view) {switch (view.getId()) {case R.id.language1://中文简体showSaveLanguage("zh");break;case R.id.language2://英文showSaveLanguage("en");break;}}/*** 保存设置的语言*/private void showSaveLanguage(String language){//设置的语言、重启的类一般为应用主入口(微信也是到首页)LanguageUtil.changeAppLanguage(this, language, MainActivity.class);//保存设置的语言SpUserUtils.putString(this, "language", language);}
}
好了,到这里就可以进行简单的测试了,编译运行APP就可以看到这样的效果。
Screenrecorder
到这里以及可以实现简单的中英文语言切换了,都是可以发现每当外面销毁这个应用程序后这个切换语言的设置并不会保存,在使用中不可能每次都要去选择语言吧!在上面外面添加工具类的时候添加了一个语言保存工具类就是为了后续这里使用的。
那么首先我们需要新建一个activity,用于切换与保存使用。
添加功能代码
代码:
package com.example.mylanguage_test;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;public class Guidance_line extends AppCompatActivity {//防止重复打开界面private static boolean ISFIRST = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_guidance_line);String language = SpUserUtils.getString(this, "language");if (ISFIRST) {ISFIRST = false;LanguageUtil.changeAppLanguage(this, language, Guidance_line.class);}Intent intent = new Intent(this, MainActivity.class);startActivity(intent);}}
然后下一步来到清单文件中改变启动 activity,可以看到新建之后多了一个
将MainActivity 中的启动代码复制到我们新建的 Guidance_line Activity中去,将 exported 修改为true。
<activityandroid:name=".Guidance_line"android:exported="true" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name=".MainActivity"android:exported="false"></activity>
接下来运行一下应用看看效果。当我们销毁应用程序后再次打开的时候还是保留着上一次的语言设置,如果还有其他语种的也是同样的方法去添加。
好了,到这里就记录的差不多了,这篇文章只是记录我自己实现这个功能的过程,也是参考别的大佬的文章改出来的。本篇中的demo会在下面贴上下载链接,有需要的自行下载使用。🐎