文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android开发-应用中英文(语言)切换(二)

2023-09-11 22:21

关注

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

来源地址:https://blog.csdn.net/x97666/article/details/130185764

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯