您的位置:首页 > 其它

安卓国际化,应用内切换语言

2015-08-28 17:56 369 查看
很多应用开发中,我们需要做多语言版本,安卓在这方面做的很好,下面就写一个简单的例子:

一、项目目录结构



这里对几个关键点进行说明下:
drawable-hdpi 为我们默认的图片存放目录

drawable-en-hdpi 为英文版本对应的图片存放目录,当然ldpi\mdpi\xhdpi 也一样,如果需要,分别按这样的规则创建目录即可。

values 为默认的配置文件目录
values-en 为英文版本的配置文件目录

values 目录下的strings.xml 内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">语言切换</string>
    <string name="content">大家好,我叫单红宇。</string>
    <string name="content2">AAAAA</string>
</resources>


values-en 目录下的strings.xml 内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Language Switch</string>
    <string name="content">Hello everyone, My name is SHANHY.</string>

</resources>

我故意在第一个strings.xml中放了content2,在第二个英文的里面没有放,是为了要说明不同语言的配置文件内容是不需要一一对应的,我们只需要在需要多语言的配置放到按规则命名的文件夹下即可。
drawable-en-hdpi 和 drawable-hdpi 下面放了2个名称相同,内容不同的图片,也是为了要说明,图片也只一样支持多语言的。

下面为MainActivity 代码:
package com.shanhy.example.spinner;

import java.util.Locale;

import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	/**
	 * 英语
	 * 
	 * @param v
	 * @author SHANHY
	 * @date 2015年8月28日
	 */
	public void switchEnglish(View v) {
		switchLanguage(Locale.ENGLISH);
	}

	/**
	 * 中文
	 * 
	 * @param v
	 * @author SHANHY
	 * @date 2015年8月28日
	 */
	public void switchChinese(View v) {
		switchLanguage(Locale.CHINESE);
	}

	/**
	 * 切换语言
	 * 
	 * @param locale
	 * @author SHANHY
	 * @date 2015年8月28日
	 */
	private void switchLanguage(Locale locale) {
		Resources res = getResources();
		Configuration config = res.getConfiguration();
		DisplayMetrics dm = res.getDisplayMetrics();
		Locale currentLocal = config.locale;
		config.locale = locale;
		res.updateConfiguration(config, dm);

		// 如果切换了语言
		if (!currentLocal.equals(config.locale)) {
			// 这里需要重新刷新当前页面中使用到的资源
			onCreate(null);
		}
	}
}


main.xml 和 AndroidManifest.xml 和我们平常开发是一样的,没有任何特殊的地方。
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:text="English" android:onClick="switchEnglish"/>

    <Button
        android:layout_width="wrap_content"
        android:textColor="@android:color/black"
        android:layout_height="wrap_content"
        android:text="中文" android:onClick="switchChinese"/>

    <TextView
        android:id="@+id/SpinnerResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:lineSpacingExtra="10dp"
        android:text="@string/content"
        android:textColor="@android:color/black"
        android:textSize="10pt"
        android:textStyle="bold" >
    </TextView>
        
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:lineSpacingExtra="10dp"
        android:text="@string/content2"
        android:textColor="@android:color/black"
        android:textSize="10pt"
        android:textStyle="bold" >
    </TextView>

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/testimg" />

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: