其实也不是多难的东西今天就是看到就想着写下,由于看了好多博客写的都是对不上号的东西,就自己写下以后好查着看。
一、简介
我们需要做的就是更新资源目录的配置信息,同时我们要设置多个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,问题不大有需求就设置下判断,这里就不说了。。。。。()