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会在下面贴上下载链接,有需要的自行下载使用。🐎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/67103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抓考研英语单词主要矛盾的经验分享,考研英语真题词频统计

按 这篇考研经验总结文章提到过&#xff0c;我自身对于一个英文句子如果单词都认识那么大概率可以自然翻译出来&#xff08;大概是得益于看英文电影&#xff08;偶尔不带翻译字幕&#xff09;和英文芯片手册多的原因培养了语感&#xff09;&#xff0c;所以主要矛盾是单词&…

23、24考研党必备的网站推荐

23、24考研党必备的网站推荐 23考研进入到后半场&#xff0c;24考研也即将迎来备考高潮。不知道以下将要推荐的网站同学们有没有在用了呢。要知道考研是一场信息战&#xff0c;考验的不只是我们的学习能力&#xff0c;还有寻找资源的能力。接下来就给大家盘点几个我总结的考研…

【软件设计师暴击考点】软件工程知识高频考点【一】

👨‍💻个人主页:@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️系统路线学习点击跳转⭐ 下午题⭐【软件设计师暴击考点】下午题高频考点暴击系列 上午题⭐【

【软件设计师暴击考点】UML知识高频考点暴击系列

👨‍💻个人主页:@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️系统路线学习点击跳转⭐ 下午题⭐【软件设计师暴击考点】下午题高频考点暴击系列 上午题⭐【

【软件设计师暴击考点】数据库系统高频考点暴击系列

👨‍💻个人主页:@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️系统路线学习点击跳转⭐ 下午题⭐【软件设计师暴击考点】下午题高频考点暴击系列 上午题⭐【

【软件设计师暴击考点】面向对象考点暴击系列

👨‍💻个人主页:@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️推荐文章⭐ ⭐🅰️系统路线学习点击跳转⭐ 下午题⭐【软件设计师暴击考

软件设计师冲刺:临考快速记忆

章节章节01 - 计算机组成原理与体系结构07 - 法律法规与标准化与多媒体基础02 - 操作系统基本原理08 - 设计模式03 - 数据库系统09 - 软件工程04 - 计算机网络10 - 面向对象05 - 数据结构与算法11 - 结构化开发与UML06 - 程序设计语言与语言处理程序基础12 - 下午题历年真题End…

软件设计师-软考中级-下午题答题笔记-答题技巧-解题方式-下午题内容学习

目录 数据流图&#xff08;DFD&#xff09; 数据流图基本概念 数据字典 数据流图平衡原则 答题技巧 数据库设计 数据库设计过程&#xff08;了解&#xff09; ER模型 答题技巧 UML建模 用例图 类图和对象图 顺序图 活动图 状态图 通信图 数据结构及算法 考察…

软件设计师--其他高频考点总结

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 软件设计师高频考点合集 视频2022软件设计师-提炼高频考点-个人学习过程的总结&#xff0c;仅供参考&#x…

【软件设计师】高频考点集锦

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软考…

软件设计师の备考经验帖及复习资料

文章目录 Laptoy祝大家逢考必过9月1号备考-11月05号考试复习资料推荐up主&#xff1a;[zst_2001](https://space.bilibili.com/91286799) 跟着视频来基本必过刷题软件&#xff1a;软考通报考地址及证书 Laptoy祝大家逢考必过 9月1号备考-11月05号考试 复习资料 章节章节01 - …

软件设计师备考资料及策略

参加软考的意义对不同的人来说可能是不一样的&#xff0c;你可能是想在找工作的时候写在简历上加分、积分落户、升职加薪、政策补贴或者是个税抵扣等。本人单纯地只是不想在以后自己的简历上太空&#xff0c;因此参加了考试&#xff0c;我参加了2022年下半年的软件设计师考试&a…

【软件设计师暴击考点】下午题高频考点暴击系列

👨‍💻个人主页:@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件设计师考点暴击 ⭐🅰️系统路线学习点击跳转⭐ 下午题视频总结:

软件设计师下午题高频考点技巧总结

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏 软件设计师高频考点合集 下午题视频总结上午题视频总结 &#x1f496;其他文章 &#x1f636;‍&#x1f3…

实测 ? 2019 史上最全 28个国外国内免费虚拟手机号平台

顾名思义 就是 免费 接受验证码 , 不是广告!!!!!!!!! 审核人员 可以自己尝试 不要给我和谐了 国内接码平台 国内&#xff08;Z-SMS)(http://www.z-sms.com/) 国内&#xff08;小鸟接码(http://www.xnsms.com/) 速码http://www.z-sms.com/(免费&#xff0c;免注册) 百万码 ht…

ES(Elasticsearch) 存储限流修改

在Elasticsearch的早期版本中&#xff0c;过度的合并将会拖慢集群&#xff0c;以至于索引和搜索请求慢得无法接收&#xff0c;或者是所有得节点都无法响应&#xff0c;这都是因为合并时对I/O产生了压力&#xff0c;导致新分段得写入很缓慢。此外&#xff0c;由于I/O得等待&…

ElasticSearch系列之实操篇-SpringBoot中对Elasticsearch的增删改查操作

SpringBoot中对Elasticsearch的增删改查操作 引包配置ES实体类Document中各个参数解释使用ElasticsearchTemplate完成增删改查操作 查(分页查询,条件查询)条件查询 排序分页增改删除 突然接到一个搜索的项目&#xff0c;需要新增一个版本&#xff0c;后台页面数据是存放在Elast…

chatgpt赋能python:Python连接Elasticsearch的完全指南

Python连接Elasticsearch的完全指南 Elasticsearch是一个流行的分布式搜索和分析引擎&#xff0c;用于处理海量数据。如今&#xff0c;越来越多的开发人员使用Python编写应用程序&#xff0c;因此支持Python的Elasticsearch客户端是至关重要的。本文将介绍Python连接Elasticse…

ElasticSearch之ES8新特性及集群安装

文章目录 1. Elasticsearch8 新特性2. Elasticsearch8安装及使用2.1 JDK说明2.2 安装软件2.2.1 集群规划2.2.2 安装步骤2.2.2.1 上传压缩包2.2.2.2 解压安装包2.2.2.3 创建Linux新用户/数据文件/证书目录2.2.2.4 设置通信秘钥2.2.2.5 生成HTTP证书2.2.2.6 调整证书位置2.2.2.7 …

es中修改索引名称命令_在Elasticsearch中更改索引名称

es中修改索引名称命令 嘿&#xff0c; 今天&#xff0c;我碰巧写了一个脚本来解决一个看起来很多人都面临的特定问题&#xff1a;重命名给定的Elasticsearch索引。 自然地&#xff0c;有记录在案的解决方案&#xff0c;但是我没有Swift找到一个脚本可以让我找到我想要的位置—…