android语言切换

不使用生命周期切换语言

1:文件结构


在xml中将对应的value创建xml文件 里边的内容和对应的string内容一样

2:将要进行语言切换的画面控件全部提到Activity中 在activity中定义一个方法进行刷新这些控件

    private void refreshUI() {
        moretitle.setText(Strings.getString(R.string.app_name));
        updateversion_text.setText(Strings.getString(R.string.versionupdate));
        share_text.setText(Strings.getString(R.string.sharetofriend));
        aboutus_text.setText(Strings.getString(R.string.aboutus));
        guesttel_text.setText(Strings.getString(R.string.guesttel));
        switchlangure_text.setText(Strings.getString(R.string.switchlangure));
    }

3:Strings.java是用来解析xml的

package com.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;

import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;

import com.aichuxing.activity.R;

/**
 */
public class Strings {
	public static final String LANGUAGE_JAPANESE = "japanese";
	public static final String LANGUAGE_CHINESE = "chinese";
	/** 一个Integer对应一个string或者string[],即<Integer, Object>。 */
	public static HashMap<Integer, Object> stringCustom;
	/** 标识当前显示的语系;默认值为英文。 */
	public static String language = LANGUAGE_CHINESE;
	/** 默认*/
	private int xmlid = R.xml.chinese;

	public static String getLanguage() {
		return language;
	}

	public void initLanguage(Context context) {
		stringCustom = readStringsXML(context, xmlid);
	}

	/** 获取指定id的字符串。 */
	public static String getString(int strId) {
		return (String) stringCustom.get(strId);
	}

	/** 获取指定id的字符串数组。 */
	public static String[] getStringArray(int strArrId) {
		return (String[]) stringCustom.get(strArrId);
	}

	private static String[] readStringArray(XmlResourceParser xmlParser)
			throws XmlPullParserException, IOException {
		String[] arr = null;
		LinkedList<String> list = new LinkedList<String>();
		String tagName, tagValue;
		while (true) {
			xmlParser.next();
			tagName = xmlParser.getName();
			if ("string-array".equals(tagName)) {
				arr = new String[list.size()];
				// 这个函数设计得好奇怪,传参和返参都一样。
				// list.toArray(arr);作用同下:
				arr = list.toArray(arr);
				break;
			}
			tagName = xmlParser.getName();
			if ((xmlParser.getEventType() == XmlResourceParser.START_TAG) && tagName.equals("item")) {
				xmlParser.next();
				tagValue = xmlParser.getText();
				list.add(tagValue);
				// Log.d("ANDROID_LAB", tagName + "=" + tagValue);
			}
		}
		return arr;
	}

	private static HashMap<Integer, Object> readStringsXML(Context context, int xmlId) {
		HashMap<Integer, Object> hashMap = new HashMap<Integer, Object>();
		Resources res = context.getResources();
		String pkg = context.getPackageName();
		XmlResourceParser xmlParser = context.getResources().getXml(xmlId);
		try {
			String tagName, attName, attValue, tagValue;
			int identifier = -1;
			int eventType = xmlParser.next();
			while (eventType != XmlResourceParser.END_DOCUMENT) {
				if (eventType == XmlResourceParser.START_DOCUMENT) {
					// Log.d("ANDROID_LAB", "[Start document]");
				} else if (eventType == XmlResourceParser.END_DOCUMENT) {
					// Log.d("ANDROID_LAB", "[End document]");
				} else if (eventType == XmlResourceParser.START_TAG) {
					tagName = xmlParser.getName();
					if ("string".equals(tagName)) {
						attName = xmlParser.getAttributeName(0);
						attValue = xmlParser.getAttributeValue(0);
						eventType = xmlParser.next();
						if (eventType == XmlResourceParser.TEXT) {
							tagValue = xmlParser.getText();
							identifier = res.getIdentifier(attValue, "string", pkg);
							hashMap.put(identifier, tagValue);
						}
					} else if ("string-array".equals(tagName)) {
						attName = xmlParser.getAttributeName(0);
						attValue = xmlParser.getAttributeValue(0);
						identifier = res.getIdentifier(attValue, "array", pkg);
						String[] arr = readStringArray(xmlParser);
						hashMap.put(identifier, arr);
					}
				} else if (eventType == XmlResourceParser.END_TAG) {
				} else if (eventType == XmlResourceParser.TEXT) {
				}
				eventType = xmlParser.next();
			}
		} catch (XmlPullParserException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return hashMap;
	}

	/**
	 * 设置新的语系。<br/>
	 * 根据新设定值对stringCustom进行更新。<br/>
	 * 
	 * @param context
	 *            调用者。
	 * @param language
	 *            语系名称。
	 * 
	 * @see LANGUAGE_JAPANESE
	 * @see LANGUAGE_CHINESE
	 * */
	public void setLanguage(Context context, String language) {
		if (language.equals(Strings.language)) {
			return;
		}
		if (language.equals(Strings.LANGUAGE_CHINESE)) {
		    
			stringCustom = readStringsXML(context, R.xml.chinese);
			xmlid = R.xml.chinese;
			Strings.language = language;
		} else if (language.equals(Strings.LANGUAGE_JAPANESE)) {
			stringCustom = readStringsXML(context, R.xml.japanese);
			xmlid = R.xml.japanese;
			Strings.language = language;
		} else {
			if (Strings.language.equals(Strings.LANGUAGE_JAPANESE) == false) {
				stringCustom = readStringsXML(context, R.xml.chinese);
				xmlid = R.xml.japanese;
				Strings.language = Strings.LANGUAGE_CHINESE;
			}
		}
	}
}
4:切换语言的事件

			AiChuXingApplication.config.locale = Locale.JAPANESE;
                        AiChuXingApplication.resources.updateConfiguration(
                                AiChuXingApplication.config,
                                AiChuXingApplication.dm);
			//上边两行是讲应用中的还没有oncreate的activity应用切换后的语言
                        AiChuXingApplication.STRINGS.setLanguage(
                                SwitchLangure.this, Strings.LANGUAGE_JAPANESE);
                        Intent mIntent = new Intent(ACTION_NAME);
                        mIntent.putExtra("LANGURE", Strings.LANGUAGE_JAPANESE);
                        // 发送广播
                        sendBroadcast(mIntent);
                        SwitchLangure.this.finish();
5:Application中
	STRINGS = new Strings();
        resources = getResources();
        config = resources.getConfiguration();
        dm = resources.getDisplayMetrics();

6:在已经oncreate并且没有ondestory的activity定义一个广播用来接收切换语言的广播

    public void registerBoradcastReceiver() {
        IntentFilter myIntentFilter = new IntentFilter();
        myIntentFilter.addAction(ACTION_NAME);
        // 注册广播
        registerReceiver(mBroadcastReceiver, myIntentFilter);
    }
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            AiChuXingApplication.STRINGS.setLanguage(MoreActivity.this, intent.getExtras().getString("LANGURE"));
            if (action.equals(ACTION_NAME)) {
                refreshUI();
            }
        }

    };
7:当然在使用之前要进行注册广播

	AiChuXingApplication.STRINGS.initLanguage(this);//初始化
        registerBoradcastReceiver();//注册广播
        refreshUI();
切换完成



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值