开发者社区> 石清泉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中动态获取最新的git commit_id
项目中有时会遇到需要我们获取最新版本号的逻辑,方便我们定位错误等。
97 0
Android动态权限(兼容6.0以下和魅族手机方案)
这里以照相机权限为例说明问题。实际开发过程中遇到了不少的坑。
37 0
Android 10.0 动态壁纸 LiveWallpaper (一)
Android 10.0 动态壁纸 LiveWallpaper (一)
140 0
android动态申请使用权限实践
android动态申请使用权限
86 0
使用APICloud开发app的动态权限及Android平台targetSdkVersion设置教程
targetSdkVersion:自2018年11月开始,GooglePlay以及国内大部分应用市场要求app编译目标SDK必须为26及以上,否则不予提交审核;有许多已有app转到APICloud开发后,因targetSdkVersion降级而导致无法覆盖安装;2020年以来,国家网信办等监管机构也加强了对app权限合规的监管。
260 0
Android 动态修改layout_weight
Android 动态修改layout_weight
283 0
Android 动态修改shape
Android 动态修改shape
156 0
Android Studio live template巧用动态模板也能大大提高你的开发效率
Android Studio live template巧用动态模板也能大大提高你的开发效率
68 0
Android自动化中动态设置网络代理
由于现在很多应用的页面数据都是AI算法推荐生成的,所以每次打开同一个页面数据都会不一样,因此在做客户端UI自动化的过程中都会采用Mock方案,利用MockServer来提供稳定的测试数据,其中MockServer的代理需要手动配置。 拿Android手机举例,过程大致是:进入设置->进入 WLAN ->找对应 wifi 连接->进入详情->找到代理->选择手动->输入主机名->输入端口号->最后保存,可以看到每次都是重复操作,特别当你的自动化设备很多以及MockServer服务不稳定导致IP经常变的情况下累加的时间成本是很高的,而且一不小心,还有可能写错
204 0
Android获取状态栏高度,动态设置控件高度
获取状态栏高度;动态设置控件高度 ;务必保持一致 ( LinearLayout. LinearLayout.LayoutParams 与需要设置的控件父控件)
258 0
+关注
石清泉12
android开发
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android开发之多进程架构
立即下载