android 语言切换-横竖屏切换时异常

前端时间要实现语言切换功能,现在总结一下。

一般用 语言_地区的形式表示一种语言,如  zh_CN, zh_TW.

各国语言缩写: http://www.loc.gov/standards/iso639-2/php/code_list.php

国家和地区简写: http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

用eclipse工具建多语言文件夹:  http://www.cnblogs.com/wuyunan/archive/2009/09/16/1567960.html

切换语言主要分为两类:

1、根据系统当前语言环境自动选择程序加载语言,若不存在对应语言的strings文件,则加载默认语言文件

此方法不需要其他代码设

2、程序内部自主选择程序使用语言,需要由代码控制

程序内实现语言切换也有几种不同实现方式,在此我给大家介绍我使用一种。

直接上语言切换的工具类

public class LanguageSettingUtil {
	//单例模式
	private static LanguageSettingUtil instance;
	private Context context;
	//存储当前系统的language设置
	private String defaultLanguage;
	//存储当前系统Locale
	private Locale defaultLocale;
	public final static String ENGLISH = "en";
	public final static String CHINESE = "zh";

	private LanguageSettingUtil(Context paramContext) {
		//得到系统语言
		Locale localLocale = Locale.getDefault();
		this.defaultLocale = localLocale;
		
		//保存系统语言到defaultLanguage
		String str = this.defaultLocale.getLanguage();
		this.defaultLanguage = str;
		
		this.context = paramContext;
	}
	//自身是否被创建
	public static LanguageSettingUtil get() {
		if (instance == null)
			throw new IllegalStateException(
					"language setting not initialized yet");
		return instance;
	}

	//初始化
	public static void init(Context paramContext) {
		if (instance == null){
			instance = new LanguageSettingUtil(paramContext);
		}
	}
	
	// 创建Configuration
	private Configuration getUpdatedLocaleConfig(String paramString) {
		
		Configuration localConfiguration = context.getResources().getConfiguration();
		Locale localLocale = getLocale(paramString);
		localConfiguration.locale = localLocale;
		return localConfiguration;
	}
	
	//得到APP配置文件目前的语言
	public String getLanguage() {
		SharedPreferences localSharedPreferences = PreferenceManager
				.getDefaultSharedPreferences(this.context);
		//如果当前程序没有设置language属性,就返回系统默认语言,如果有,就返回以前的
		return localSharedPreferences.getString("language", this.defaultLanguage);
	}
	//如果配置文件中没有语言配置
	public Locale getLocale() {
		String str = getLanguage();
		return getLocale(str);
	}
	//创建新Locale并覆盖原Locale
	public Locale getLocale(String paramString) {
		Locale localLocale = new Locale(paramString);
		Locale.setDefault(localLocale);
		return localLocale;
	}

	//刷新显示配置
	public void refreshLanguage()
	{
		String str = getLanguage();
		Resources localResources = this.context.getResources();
		if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
			Configuration localConfiguration = getUpdatedLocaleConfig(str);
			//A structure describing general information about a display, such as its size, density, and font scaling.
			DisplayMetrics localDisplayMetrics = localResources
					.getDisplayMetrics();
			localResources.updateConfiguration(localConfiguration,
					localDisplayMetrics);
		}
	}

	//设置系统语言
	public void saveLanguage(String paramString) {
		PreferenceManager.getDefaultSharedPreferences(this.context).edit()
				.putString("language", paramString).commit();
	}
	//保存系统的语言配置到SharedPreferences
	public void saveSystemLanguage(){
		PreferenceManager.getDefaultSharedPreferences(this.context).edit()
		.putString("PreSysLanguage", this.defaultLanguage).commit();
	}
	
	public void checkSysChanged(String cuerSysLanguage){
		//如果系统语言设置发生变化
		if(!cuerSysLanguage.equals(PreferenceManager
				.getDefaultSharedPreferences(this.context)
				.getString("PreSysLanguage", "zh"))){
			//如果系统保存了this对象,就在这里修改defaultLanguage的�?为当前系统语�?uerSysLanguage
			this.defaultLanguage = cuerSysLanguage;
			saveLanguage(cuerSysLanguage);
			saveSystemLanguage();
		}
	}
}


应用语言初始化,在Application 的oncreat里调用

	LanguageSettingUtil.init(this);
		languageSetting = LanguageSettingUtil.get();
		// 拿到当前系统语言设置
		curSysLanguage = Locale.getDefault().getLanguage();
		languageSetting.checkSysChanged(curSysLanguage);
		languageSetting.refreshLanguage();


应用语言设置,设置代码

	// 拿到当前系统语言设置
		String curSysLanguage = Locale.getDefault().getLanguage();

		mOmApp.languageSetting.checkSysChanged(curSysLanguage);
		if (arg1)
		{
			// 设置更换的语言
			mOmApp.languageSetting.saveLanguage("en");
		} else
		{
			// 设置更换的语言
			mOmApp.languageSetting.saveLanguage("zh");
		}
		// 更新
		mOmApp.languageSetting.refreshLanguage();

当然要设置对应的string文件

android 语言切换-横竖屏切换时异常_第1张图片

别忘了添加权限

 
    

            
到此为止,语言设置可以实现了,并且只对你的应用设置语言,但是在调试过程中出现一个问题,当横竖屏切换时候,会恢复到默认语言。后来发现需要

AndroidManifest.xml

每一个Activity中都要加: android:configChanges="locale"。(每一个未检测)

或者在你的Application里添加

@Override
 public void onConfigurationChanged(Configuration newConfig)
 {
  // TODO Auto-generated method stub
  super.onConfigurationChanged(newConfig);
  languageSetting.refreshLanguage();
 }

你可能感兴趣的:(android,功能实现技巧,androd,功能实现技巧)