【Android 多语言切换简单实例分享】

一.Android多语言切换

Android应用的开发不可能仅仅针对某一个国家或者区域使用,各国间语言文化各不同样,因此一个优秀的APP必须支持多种语言,为了实现这个特性,Android给出了一个解决方案,在res文件夹下通过values+语言编码来实现多国语言的支持(中间採用连字符号-连接)。比如:values-es代表英文,假设你决定了你的应用要支持多国语言。那么你就必须新建多种values-XXX的多语言支持文件,以下通过一个样例来看看主要的使用方式,先看下效果图:

【Android 多语言切换简单实例分享】

1.project结构

【Android 多语言切换简单实例分享】

注:主要看下res/values-en/strings.xml代表英文字符串资源文件,res/values-zh/strings.xml代表中文.

  • res/values-en/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">SwitchLanguage</string>
    <string name="hello_world">This is an instance of Android</string>
    <string name="switch_language">Switch Language</string>
    <string name="english">English</string>
    <string name="chinese">Chinese</string>
    <string name="jump">Jump to Next Activity</string>
    <string name="change">The language of the page has changed, too.</string>
    <string name="showtext">You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.</string>
</resources>
  • res/values-zh/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">切换语言</string>
    <string name="hello_world">这是一个Android实例</string>
    <string name="switch_language">切换语言</string>
    <string name="english">英语</string>
    <string name="chinese">中文</string>
    <string name="jump">跳转到还有一个页面</string>
    <string name="change">这个页面语言也发生了变化</string>
    <string name="showtext">你不能改变你的过去。但你能够让你的未来变得更美好。一旦时间浪费了,生命就浪费了。</string>

</resources>

2.代码实现

  1. BaseActivity.java
public class BaseActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // 初始化PreferenceUtil
        PreferenceUtil.init(this);
        // 依据上次的语言设置,又一次设置语言
        switchLanguage(PreferenceUtil.getString("language", "zh"));
    }

    /**
     * 
     * <切换语言>
     * 
     * @param language
     * @see [类、类#方法、类#成员]
     */
    protected void switchLanguage(String language)
    {
        // 设置应用语言类型
        Resources resources = getResources();
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        if (language.equals("en"))
        {
            config.locale = Locale.ENGLISH;
        }
        else
        {
            // 中文简体
            config.locale = Locale.SIMPLIFIED_CHINESE;
        }
        resources.updateConfiguration(config, dm);

        // 保存设置语言的类型
        PreferenceUtil.commitString("language", language);
    }
}

2、 MainActivity.java

public class MainActivity extends BaseActivity implements OnClickListener{

    private Dialog mDialog;

    private TextView textShow;

    private Button button;

    private Button button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView) findViewById(R.id.text);
        button = (Button) findViewById(R.id.btn);
        button2 = (Button) findViewById(R.id.btn_2);
        textShow = (TextView)findViewById(R.id.text_show);
        textView.setText(R.string.hello_world);
        button.setText(R.string.switch_language);
        //监听切换语言按钮,弹出dialog选择语言
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mDialog == null) {
                    LayoutInflater inflater = getLayoutInflater();
                    View layout = inflater.inflate(R.layout.dialog_select_lanuage,null);
                    TextView english = (TextView) layout.findViewById(R.id.select_english);
                    TextView chinese = (TextView) layout.findViewById(R.id.select_chinese);
                    mDialog = new Dialog(MainActivity.this, R.style.Custom_Dialog_Theme);
                    mDialog.setCanceledOnTouchOutside(false);
                    english.setOnClickListener(MainActivity.this);
                    chinese.setOnClickListener(MainActivity.this);
                    mDialog.setContentView(layout);
                }
                mDialog.show();
            }
        });

        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent it = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(it);
            }
        });
    }

    @Override
    public void onClick(View v) {
        mDialog.dismiss();  
        switch (v.getId()) {
            case R.id.select_english:
                //切换为英文
                switchLanguage("en");
                break;
            case R.id.select_chinese:
                //切换为中文
                switchLanguage("zh");
                break;

            default:
                break;
        }
        //更新语言后。destroy当前页面,又一次绘制
        finish();
        Intent it = new Intent(MainActivity.this, MainActivity.class);
        startActivity(it);
    }

}
  • activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        android:text="@string/switch_language" />

    <Button
        android:id="@+id/btn_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        android:text="@string/jump" />

    <TextView
        android:id="@+id/text_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerInParent="true"
        android:textSize="18sp"
        android:text="@string/showtext" />

</RelativeLayout>

3、 工具类PreferenceUtil.java

public class PreferenceUtil {

    private static SharedPreferences mSharedPreferences = null;
    private static Editor mEditor = null;

    public static void init(Context context){
        if (null == mSharedPreferences) {
            mSharedPreferences = android.preference.PreferenceManager.getDefaultSharedPreferences(context) ;
        }
    }

    public static void removeKey(String key){
        mEditor = mSharedPreferences.edit();
        mEditor.remove(key);
        mEditor.commit();
    }

    public static void removeAll(){
        mEditor = mSharedPreferences.edit();
        mEditor.clear();
        mEditor.commit();
    }

    public static void commitString(String key, String value){
        mEditor = mSharedPreferences.edit();
        mEditor.putString(key, value);
        mEditor.commit();
    }

    public static String getString(String key, String faillValue){
        return mSharedPreferences.getString(key, faillValue);
    }

    public static void commitInt(String key, int value){
        mEditor = mSharedPreferences.edit();
        mEditor.putInt(key, value);
        mEditor.commit();
    }

    public static int getInt(String key, int failValue){
        return mSharedPreferences.getInt(key, failValue);
    }

    public static void commitLong(String key, long value){
        mEditor = mSharedPreferences.edit();
        mEditor.putLong(key, value);
        mEditor.commit();
    }

    public static long getLong(String key, long failValue) {
        return mSharedPreferences.getLong(key, failValue);
    }

    public static void commitBoolean(String key, boolean value){
        mEditor = mSharedPreferences.edit();
        mEditor.putBoolean(key, value);
        mEditor.commit();
    }

    public static Boolean getBoolean(String key, boolean failValue){
        return mSharedPreferences.getBoolean(key, failValue);
    }
}

4、 SecondActivity.java是要跳转的Activity,比較简单,仅仅有一个TextView用来显示文本,语言切换。文本语言也随之切换。

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}
  • activity_second.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="@string/change" />

</RelativeLayout>

样例比較简单,关键代码都有凝视,有问题欢迎留言讨论,共同学习。

參考文献:http://my.oschina.net/jack1900/blog/290694