APP中针对不同国家不同地区的人群使用那么应用的语言自然也要能够随时进行切换,最近做的项目有中文和英文切换的需求,所以在了解了一下网上常用的方法后记录一下我使用的方法,只是简单的应用,后续如果有不同需求需要自己去改。♻
一、Android Studio新建工程
新建工程就不过多赘述了,建好之后记得运行一下,看看是否建立的正确,养成良好习惯。
二、添加对应语言的配置文件
在res目录下新建一个对应语言的配置文件(这里以英文为例)。
好,建立好配置文件后外面可以看看res目录下就多了values-en文件夹。
然后点击进去这个英文的配置文件,将默认中文中的字符定义全部复制过来替换成英文。
原默认中文文件:
需要切换的英文文件:
接下来定义一下主界面的UI,随便写了几个按键做测试。
代码:
三、添加语言切换与保存的工具
添加两个 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;public class LanguageUtil { private static final String ENGLISH = "en"; private static final String CHINESE = "ch"; private static final String TRADITIONAL_CHINESE = "zh_rTW"; private static HashMap languagesList = new HashMap(3) {{ put(ENGLISH, Locale.ENGLISH); put(CHINESE, Locale.CHINESE); put(TRADITIONAL_CHINESE, Locale.TRADITIONAL_CHINESE); }}; 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(); // 重启app Intent 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); } 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; } 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; } 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(); } public static String getString(Context context, String key) { SharedPreferences preferences = getSp(context); return preferences.getString(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; @Override protected 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; @Override protected 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。
接下来运行一下应用看看效果。当我们销毁应用程序后再次打开的时候还是保留着上一次的语言设置,如果还有其他语种的也是同样的方法去添加。
好了,到这里就记录的差不多了,这篇文章只是记录我自己实现这个功能的过程,也是参考别的大佬的文章改出来的。本篇中的demo会在下面贴上下载链接,有需要的自行下载使用。🐎