android基础知识---语言切换

其实也不是多难的东西今天就是看到就想着写下,由于看了好多博客写的都是对不上号的东西,就自己写下以后好查着看。
一、简介
我们需要做的就是更新资源目录的配置信息,同时我们要设置多个value比如value-en就是代表英语的value文件夹。

二、实现
首先我们来看下我们的Local
我就不全贴了以英语为例

    static public final Locale ENGLISH = createConstant("en", "");

里面还有很多,我们就是要把设置这个Configuration,它 包含了设备的所有的配置信息,这些配置信息会影响应用获取的资源。例如 string 资源,就是根据 Configuration 的 locale 属性来判断该取哪种语言的 string 资源,默认是 value 文件夹下的。我们就要把其中的local属性切换了。

代码如下

   //获取资源目录
        Resources resources = getResources();
        //获取资源目录中的配置信息
        Configuration config = resources.getConfiguration();
        //获取系统显示区域信息
        DisplayMetrics dm = resources.getDisplayMetrics();
        //配置local信息
        config.locale = newlocale;
        //更新资源目录的配置信息
        resources.updateConfiguration(config, dm);

上面的newlocale

newlocale=Locale.ENGLISH

好了,我们要注意的是我们要重启

    Intent it = new Intent(context,MainActivity.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);//这个必须添加
        context.startActivity(it);

上面的代码理论没太大问题但是关键,我们设置的位置如果和要跳转的activity不在一个栈中就不会有设置语言的效果,所以我们这里要是杀死进程,保证重启。

    Intent it = new Intent(context,MainActivity.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);//这个必须添加
        context.startActivity(it);
        // 杀掉进程
        android.os.Process.killProcess(android.os.Process.myPid());

好了贴下全部代码

package com.example.admin.yuyanqiehuan;

import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    private Button btn_switch_en,btn_switch_zh;
    private final String action = "cn.lyh.language";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        btn_switch_en = (Button)findViewById(R.id.btn_switch_en);
        btn_switch_en.setOnClickListener(clickListener);

        btn_switch_zh = (Button)findViewById(R.id.btn_switch_zh);
        btn_switch_zh.setOnClickListener(clickListener);
    }



    private View.OnClickListener clickListener = new View.OnClickListener(){

        @Override
        public void onClick(View v) {

            Intent i = new Intent(action);
            switch(v.getId()){
                case R.id.btn_switch_en:
                    switchLanguage(Locale.ENGLISH);
                    finish();
                    sendBroadcast(i);
                    break;
                case R.id.btn_switch_zh:
                    switchLanguage(Locale.CHINESE);
                    finish();
                    sendBroadcast(i);
                    Intent it = new Intent(MainActivity.this,MainActivity.class);
                    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);//这个必须添加
                    startActivity(it);
                    break;
            }

        }

    };

    public void switchLanguage(Locale locale) {
        //获取资源目录
        Resources resources = getResources();
        //获取资源目录中的配置信息
        Configuration config = resources.getConfiguration();
        //获取系统显示区域信息
        DisplayMetrics dm = resources.getDisplayMetrics();
        //配置local信息
        config.locale = locale;
        //更新资源目录的配置信息
        resources.updateConfiguration(config, dm);
    }
}
package com.example.admin.yuyanqiehuan;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 通过BroadcastReceiver重启当前页面,实现语言切换
 */
public class SwitchReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {

        Intent it = new Intent(context,MainActivity.class);
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);//这个必须添加
        context.startActivity(it);
        // 杀掉进程
        android.os.Process.killProcess(android.os.Process.myPid());
    }

}

这里你会发现你加上了这句话 就切换不了语言,因为你杀死了全部的进程,程序重新开始加载默认的资源,所以你要用SharedPreferences吧语言存下来,在appliction中重新配置,这么写可以持久化改变语言的种类,因为你杀死进程后,你的记录就没了下次还需要设置,这很显然是不行的,而且这么写你就不用在其他的地方设置了就在application解决了。

package com.example.admin.yuyanqiehuan;

import android.app.Application;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.Log;

import java.util.Locale;

/**
 * Created by admin on 2017/4/18.
 */

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //获取资源目录
        Resources resources = getResources();
        //获取资源目录中的配置信息
        Configuration config = resources.getConfiguration();
        //获取系统显示区域信息
        DisplayMetrics dm = resources.getDisplayMetrics();
        //配置local信息
        config.locale = getSetLocale();
        //更新资源目录的配置信息
        resources.updateConfiguration(config, dm);
    }

    // 得到设置的语言信息
    private Locale getSetLocale() {
        SharedPreferences pref =  getApplicationContext().getSharedPreferences("date",MODE_PRIVATE);
        int localNum = pref.getInt("local", 0);//第二个参数为默认值
        Log.e("当前语言种类",localNum+"====");
        Locale locale=null;
        switch (localNum){
            case 0:
                locale=Locale.CHINA;
                break;
            case 1:
                locale=Locale.ENGLISH;
                break;
        }
        return locale;
    }
}
SharedPreferences pref =  context.getSharedPreferences("date",MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        int localNum=intent.getIntExtra("local",0);
        editor.putInt("local",localNum);
        editor.commit();

        Intent it = new Intent(context,MainActivity.class);
//

        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_CLEAR_TASK);//这个必须添加
        context.startActivity(it);
        // 杀掉进程
        android.os.Process.killProcess(android.os.Process.myPid());
        System.exit(0);

最后提醒下,一个小问题你们可能遇不到,当你从应用中切出去,改变了系统语言的设置,当再切应用的时候,我发现语言也会变成系统语言。
这是因为系统的会影响到我们的local,问题不大有需求就设置下判断,这里就不说了。。。。。()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值