Android动态设置多语言

简介:

动态设置多语言

效果图:

这里写图片描述

需求:在设置中添加一个可以设置语言的需求,点击选中的语言,就可以切换显示。

demo代码:

APP类:app初始化的时候获取保存的语言(没有就系统默认),设置语言。

public class APP extends Application {
    private Object locale;

    @Override
    public void onCreate() {
        super.onCreate();
        //设置语言
        setLanguage();
    }

    private void setLanguage() {
        Locale locale = getLocale();
        Configuration configuration = getResources().getConfiguration();
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        if (locale != null) {
            configuration.locale = locale;
            getResources().updateConfiguration(configuration, metrics);
        } else {
            configuration.locale = Locale.getDefault();
            getResources().updateConfiguration(configuration, metrics);
        }
    }

    public Locale getLocale() {

        File file = new File(getFilesDir(), "locale");
        if (!file.exists()) {
            return null;
        }
        ObjectInputStream objectInputStream = null;
        try {
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
            return (Locale) objectInputStream.readObject();
        } catch (Exception e) {

        } finally {
            try {
                if (objectInputStream != null) {
                    objectInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

SettingActivity页面:

public class SettingActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView tv_en;
    private TextView tv_zh;
    private TextView tv_ja;
    private TextView tv_ar;
    private TextView tv_defalut;
    private Configuration configuration;
    private DisplayMetrics displayMetrics;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar == null) return;
        toolbar.setTitle(getString(R.string.app_name));
        toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));

        tv_defalut = (TextView) findViewById(R.id.defalut);
        tv_en = (TextView) findViewById(R.id.en);
        tv_zh = (TextView) findViewById(R.id.zh);
        tv_ja = (TextView) findViewById(R.id.ja);
        tv_ar = (TextView) findViewById(R.id.ar);
        configuration = getResources().getConfiguration();
        displayMetrics = getResources().getDisplayMetrics();
        tv_defalut.setOnClickListener(this);
        tv_en.setOnClickListener(this);
        tv_zh.setOnClickListener(this);
        tv_ja.setOnClickListener(this);
        tv_ar.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.defalut:
                configuration.locale = Locale.getDefault();
                break;
            case R.id.en:
                configuration.locale = Locale.ENGLISH;
                break;
            case R.id.zh:
                configuration.locale = Locale.SIMPLIFIED_CHINESE;
                break;
            case R.id.ja:
                configuration.locale = Locale.JAPANESE;
                break;
            case R.id.ar:
                configuration.locale = new Locale("ar", "");
                break;
            default:
                configuration.locale = Locale.getDefault();
                break;
        }
        //切换语言时,同时改变水平布局的方向
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(configuration.locale);
        }
        saveLocale(configuration.locale);
        getResources().updateConfiguration(configuration, displayMetrics);
        reloadApp();
    }

    private void saveLocale(Locale locale) {
        if (locale == null) {
            locale = Locale.getDefault();
        }
        File file = new File(getFilesDir(), "locale");
        ObjectOutputStream objectOutputStream = null;
        try {
            objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
            objectOutputStream.writeObject(locale);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objectOutputStream != null) {
                    objectOutputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void reloadApp() {
        Intent intent = new Intent(SettingActivity.this, LauncherActivity.class);
        intent.setAction(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        /**
         *  设置singleTask启动模式
         *  1.配置文件中设置launchMode="singleTask"
         *  2.页面跳转时setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)
         *
         *  singleTask启动模式:当activity设置了该启动模式,再次跳转启动时,会将任务栈中的其他activity销毁,只让自己独自在栈中
         */
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        /**
         * 设置singleTop启动模式
         * 1.配置文件设置launchMode="singleTop"效果一样
         * 2.页面跳转时setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
         *
         * singleTop启动模式:当activity设置了该启动模式,再次跳转启动时,会将任务栈中,在该activity之上的activity销毁,保持该activityyi处于栈顶状态。
         */
        //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

strings.xml内容:

默认/en
<string name="app_name">Multi_language</string>
<string name="title">Hello world</string>

阿拉伯语/ar
<string name="app_name">متعدد اللغات</string>
<string name="title">مرحبا العالم</string>

日语/ja
<string name="app_name">マルチ言語</string>
<string name="title">こんにちは世界</string>

汉语/zh
<string name="app_name">多语言</string>
<string name="title">你好,世界</string>

主要是通过activity的启动模式,重新启动app,做初始化操作,语言就设置成功了。

目录
相关文章
|
2月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
|
6月前
|
数据库连接 数据库 Android开发
Android -- Room简化数据库设置图书案例
Android -- Room简化数据库设置图书案例
22 0
|
5天前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
16 5
|
3月前
|
网络安全 Android开发
2023安卓逆向 -- 抓包环境设置(Charles+Postern)
2023安卓逆向 -- 抓包环境设置(Charles+Postern)
32 0
|
4月前
|
XML Java Android开发
Android App开发之图像加工中给图像添加水波动态特效(附源码和演示视频 简单易懂)
Android App开发之图像加工中给图像添加水波动态特效(附源码和演示视频 简单易懂)
40 0
|
4月前
|
XML 数据库 数据安全/隐私保护
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
Android App规范处理中版本设置、发布模式、给数据集SQLite加密的讲解及使用(附源码 超详细必看)
40 0
|
4月前
|
XML Java Android开发
Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)
Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)
79 0
|
4月前
|
XML Java Android开发
Android Studio中视图基础之设置视图的宽高、间距、对齐方式的讲解与实战(附源码 超详细必看)
Android Studio中视图基础之设置视图的宽高、间距、对齐方式的讲解与实战(附源码 超详细必看)
70 0
|
8月前
|
Java Android开发
Android 中设置EditText输入框提示文本hint的字体大小
Android 中设置EditText输入框提示文本hint的字体大小
202 0