Android11 修改系统语言

1.定义一个view

<RelativeLayout
                        android:id="@+id/rlChooseLanguage"
                        style="@style/SettingAboutItem">

                        <TextView
                            style="@style/SettingAboutItemTextView"
                            android:text="@string/choose_language" />

                        <ImageView style="@style/SettingAboutArrowImageView" />
                    </RelativeLayout>

2.java代码中给该view设置点击事件

private void showChooseLanguageDialog() {
        final String[] languages = {getString(R.string.language_chinese), getString(R.string.language_english)};
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(getString(R.string.choose_language))
                .setSingleChoiceItems(languages, getCurrentLanguageIndex(), (dialog, which) -> {
                    final String selectedLanguage = languages[which].equals(getString(R.string.language_chinese)) ? "zh" : "en";
                    dialog.dismiss();
                    ToastUtil.show(getString(R.string.language_waitting));
                    if (!selectedLanguage.equals(getCurrentLanguage())) {
                        mHandler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                changeAppLanguage(selectedLanguage);
                                restartApp();
                            }
                        }, 500);

                    }
                })
                .show();
    }
private String getCurrentLanguage() {
        Locale currentLocale = getResources().getConfiguration().locale;
        return currentLocale.getLanguage();
    }

    private int getCurrentLanguageIndex() {
        if (getCurrentLanguage().equals("zh")) {
            return 0;
        } else if (getCurrentLanguage().equals("en")) {
            return 1;
        }
        return 0;
    }

 

<string name="choose_language">选择语言</string>
    <string name="language_chinese">中文</string>
    <string name="language_english">英文</string>
    <string name="language_waitting">修改配置中,请稍候...</string>

3.使用反射,调用修改语言功能

//设置语言,使用反射
    public void changeAppLanguage(String languageCode) {
        Locale locale = new Locale(languageCode);
        try {
            Class localPicker = Class.forName("com.android.internal.app.LocalePicker");
            Method updateLocale = localPicker.getDeclaredMethod("updateLocale",
                    Locale.class);
            updateLocale.invoke(null, locale);
        } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException
                 | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

4.如果设备直接修改Locale信息无效,且使用反射也无效,可以直接跳转到系统设置页面,引导用户修改语言

Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
            startActivity(intent);

5.重启app代码

private void restartApp() {
        Intent intent = MyApplication.getInstance().getPackageManager().getLaunchIntentForPackage(MyApplication.getInstance().getPackageName());
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        System.exit(0); // 强制退出当前进程
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邵旺运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值