开发者社区> 石清泉12> 正文

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,做初始化操作,语言就设置成功了。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
组件化系列(一)Android动态权限
历史版本权限组件使用的是AndPermission,长期无人维护,历史代码臃肿,不便拓展,考虑使用PermissionsDispatcher,但是PermissionsDispatcher APT插件会影响编译效率,easypermissions侵入性太强,会影响整个工程,RxPermissions 貌似是最佳选择,但是RxPermissions需要高度自定义符合自己项目特色的UI,所以干脆自己写个权限组件好了,希望大家喜欢
19 0
Android中动态获取最新的git commit_id
项目中有时会遇到需要我们获取最新版本号的逻辑,方便我们定位错误等。
173 0
Android动态权限(兼容6.0以下和魅族手机方案)
这里以照相机权限为例说明问题。实际开发过程中遇到了不少的坑。
57 0
Android 10.0 动态壁纸 LiveWallpaper (一)
Android 10.0 动态壁纸 LiveWallpaper (一)
321 0
android动态申请使用权限实践
android动态申请使用权限
97 0
使用APICloud开发app的动态权限及Android平台targetSdkVersion设置教程
targetSdkVersion:自2018年11月开始,GooglePlay以及国内大部分应用市场要求app编译目标SDK必须为26及以上,否则不予提交审核;有许多已有app转到APICloud开发后,因targetSdkVersion降级而导致无法覆盖安装;2020年以来,国家网信办等监管机构也加强了对app权限合规的监管。
403 0
Android 动态修改layout_weight
Android 动态修改layout_weight
379 0
Android 动态修改shape
Android 动态修改shape
181 0
Android Studio live template巧用动态模板也能大大提高你的开发效率
Android Studio live template巧用动态模板也能大大提高你的开发效率
82 0
+关注
石清泉12
android开发
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
蚂蚁聚宝Android秒级编译——Freeline
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像