Android开发-应用中英文(语言)切换(二)
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会在下面贴上下载链接,有需要的自行下载使用。
Android开发-应用中英文(语言)切换(二)相关推荐
- Android开发:kotlin语言实现简易计算器
Android开发:kotlin语言实现简易计算器 1. 实现效果 2. 主要文件代码: 界面布局:activity_main.xml文件代码 字符定义:string.xml文件代码 逻辑实现:Mai ...
- 网页中英文语言切换解决方案
网页中英文语言切换解决方案 参考文章: (1)网页中英文语言切换解决方案 (2)https://www.cnblogs.com/seasons1987/archive/2012/10/09/27163 ...
- android的app语言无法切换,Android应用实现多语言切换
关于Android应用实现多语言切换,有好几种办法,网上也搜到很多资料,这里有个简单有效的办法. 步骤如下: 在资源文件中新建一个文件夹values-en,在里面新建一个strings.xml,把默认 ...
- java国际化转换_java 实现国际化 中英文语言切换
[实例简介] java实现国际化中英文语言切换 java语言切换JSP国际化 [实例截图] [核心代码] JAVA国际化实现 └── struts01 ├── src │ ├── com │ ...
- Android开发中横竖屏切换的问题以及系统提供的常用Activity
Android开发中横竖屏切换的问题以及系统提供的常用Activity(总结) 2018年06月28日 16:18:45 北极熊的微笑 阅读数:72 横竖屏切换与状态保存的问题 前面也也说到了App横 ...
- android开发是java语言吗_android开发是用java语言吗?
android开发的主流语言是java语言,但也可以使用其他语言,例可以通过Android NDK使用C/C++作为编程语言来开发应用程序,也可使用SL4A来使用其他各种脚本语言进行编程. Andro ...
- 简单的入门Android开发和Java语言基础[图]
简单的入门Android开发和Java语言基础[图] 前言: 去年年底到今年年初,我做过简单的智能家居,也实现过一些简单的直连和远程的智能家居.于是就将最简单的通信发布出来:智能家居简单实现-使用ES ...
- Android 实现应用内语言切换(包括不重启应用方式)
一.前言 对于一个移动应用,可能不仅仅是面向一个国家的用户,所以多语言国际化是移动应用开发中比较常见的一个功能:正常实现多语言国际化,我们只需要在资源目录下res/下创建需要支持的国家values目录 ...
- 学android开发,入门语言JAVA知识点
Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学java语言吧. Android开发入门教程 ...
最新文章
- 为何jsp 在resin下乱码,但在tomcat下却工作良好的问题
- TensorFlow2简单入门-加载及预处理文本
- 美团字节滴滴重启支付大战,王兴张一鸣不甘心
- [Python人工智能] 二十九.什么是生成对抗网络GAN?基础原理和代码普及(1)
- linux nginx线程池,nginx使用线程池提升9倍性能
- oppo,ofp格式解包工具.Unpack ofp oppo手机,ofp线刷包解包教程
- DOS攻击之Synflood攻击
- 详解51系列单片机引脚及功能
- excel 柱状图 多个水滴图组合
- Win10播放视频卡顿怎么解决
- crontab一些常用的语法 每天凌晨1点重启一遍
- C# 验证码生成照码编程之后
- 你唯有试过几个后,才能对女人这物种有全局判断。所以分手别忧桑,正确态度是:ok我已经有一个data point,现在我来找更多的data points来组成一个sample从而在这个认知基础上选择
- 暗黑系王者,低照度图像增强技术解析
- 在python中怎么定义一个范围_如何定义范围
- Python Tricks : Function Argument Unpacking
- percent sql_使用SQL Server中的PERCENT_RANK函数计算SQL百分位数
- stm32控制超声波测距模块HC-SR04
- mysql属于dql语句的是_4.MySql中的SQL语句(三):DQL
- SNN学习笔记-静息电位和平衡电位的理解