1. 程式人生 > >Android應用的多語言切換

Android應用的多語言切換

在一些應用需要國際化或者面對各種使用者群體時,會涉及到語言的不同,所以我們在開發應用apk時,記得一定要養成將應用中涉及到的所有文字資訊放在string.xml裡的好習慣!Android中的多語言切換,對於我們應用層的開發同學來時,操作起來非常見到,程式碼也很簡單,大部分工作都是讓framwork層的資源程序排程框架給代工了。OK,下面我們一步步看看怎麼完成多語言的配置和切換:

1.右擊res目錄,開啟對應的對話方塊:
這裡寫圖片描述

2.選擇local選項,然後點選右推的按鈕,建立和選擇新的語言資原始檔,注意以下這幾個地方需要正確填寫:

這裡寫圖片描述

這裡寫圖片描述

然後點選ok就會開發專案目錄中多了一個資料夾和檔案:

這裡寫圖片描述

3.接著把預設的values/strings.xml中的內容全部複製到values-en/strings.xml中,然後把內容中的文字順便翻譯成對應的語言:

這裡寫圖片描述
這裡寫圖片描述

4.接下來就是在activity中引用和設定的操作了:

首先需要定義一個全域性變數存放activity棧和選擇的語言類別:

public class Constants {
    //系統預設是zh的型別
    public static String langae = "zh";
    public static List<Activity> activityList = new ArrayList<>();
}

MainActivity.java中:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Constants.activityList.add(this);
        switchLanguage(Constants.langae);
    }
    public
void onclick(View view) { startActivity(new Intent(this, SecendActivity.class)); } //核心設定的程式碼 protected void switchLanguage(String language) { Resources resources = getResources(); Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); switch (language) { case "zh": config.locale = Locale.CHINESE; resources.updateConfiguration(config, dm); break; case "en": config.locale = Locale.ENGLISH; resources.updateConfiguration(config, dm); break; default: config.locale = Locale.US; resources.updateConfiguration(config, dm); break; } } }

在onCreate()中設定語言的預設值。

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@color/colorPrimary"
        android:onClick="onclick"
        android:padding="10dp"
        android:text="@string/lanage"
        android:textColor="#fff" />

</RelativeLayout>

SecendActivity.xml:

public class SecendActivity extends Activity {

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

        Constants.activityList.add(this);

        RadioGroup radio = (RadioGroup) findViewById(R.id.radio);
        final RadioButton radioButtonen = (RadioButton) findViewById(R.id.radio_en);
        final RadioButton radioButtonzh = (RadioButton) findViewById(R.id.radio_zh);

        if (Constants.langae.equals("zh")) {
            radioButtonzh.setChecked(true);
        } else {
            radioButtonen.setChecked(true);
        }

        radio.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (checkedId == R.id.radio_zh) {
                    Constants.langae = "zh";
                    radioButtonen.setChecked(false);
                } else {
                    radioButtonzh.setChecked(false);
                    Constants.langae = "en";
                }
            }
        });
    }

    public void onClick(View view) {
        Locale locale = new Locale(Constants.langae);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        Resources resources = getResources();
        resources.updateConfiguration(config, resources.getDisplayMetrics());

        //讓之前開啟的所有介面全部徹底關閉
        for (Activity activity : Constants.activityList) {
            activity.finish();
        }
        //回到應用的首頁
        startActivity(new Intent(this, MainActivity.class));
    }
}

atty_secend_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RadioGroup
        android:id="@+id/radio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/radio_zh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="@string/zh" />

        <RadioButton
            android:id="@+id/radio_en"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50dp"
            android:text="@string/en" />

    </RadioGroup>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@color/colorPrimary"
        android:onClick="onClick"
        android:padding="10dp"
        android:text="@string/click"
        android:textColor="#fff" />

</RelativeLayout>

5.寫完程式碼後,我們執行看看:

設定前:
這裡寫圖片描述 這裡寫圖片描述

設定後:
這裡寫圖片描述 這裡寫圖片描述