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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值