Android預設顯示系統語言、應用中手動切換語言、下次登入顯示使用者切換的語言完整版

2020-09-13 13:01:30

最近再做一款其他國家也能通用的app,所以涉及到語言國際化,本來感覺挺簡單的,直接獲取手機系統語言,然後app根據使用者系統語言變化而變化,但是這邊還要求要加使用者可以手動切換語言的功能,及涉及到退出應用肯定要儲存使用者之前設定好的語言偏好,在費勁了一下午終於搞定了,直接來看完整程式碼吧,實現過程也相對其他的比較簡單:
宣告 我這裡設定使用者可切換的語言為簡體中文,英語和繁體中文

效果圖:
在這裡插入圖片描述
程式碼實現:
MainActivity.class

class MainActivity : Activity() {

    override fun onCreate(savedInstanceState: Bundle?) {
       //初始化語言
        LanguageUtil.checkLanguage(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initData()
    }

    private fun initData() {
     nihao.setOnClickListener {
        startActivity(Intent(this,LanguageChangeActivity::class.java))
     }
    }

}

MainActivity 裡面就是 一個文字,點選文字跳轉到語言選擇介面

public class LanguageUtil {
    //預設跟隨系統語言,使用者上一次切換過,顯示使用者設定的語言
    public static void checkLanguage(Context context) {
        SharedPreferences sharedPreferences = context.getSharedPreferences(Contast.TABLE_TABLE, MODE_PRIVATE);
        String language = sharedPreferences.getString(Contast.TABLE_LANGUAGE, "");
        //獲取系統語言
        String lablelang =context.getResources().getString(R.string.lable_lang).trim();
        Log.i("BaseApplicationaa","current language is"+lablelang);
        Log.i("BaseApplicationaa","save language is"+language);
        String localObject1="";
        DisplayMetrics localDisplayMetrics;
        //本地儲存的和獲取系統的不一樣時
        if(!language.equals(lablelang)){
            if(!"".equals(language)){
                localObject1=language;
            }else {

                localObject1=lablelang;
                SharedPreferences.Editor  editor = sharedPreferences.edit();
                editor.putString(Contast.TABLE_LANGUAGE, lablelang);
                editor.commit();
            }
        }
        Configuration localConfiguration;
        Resources resources = context.getResources();
        localConfiguration = resources.getConfiguration();
        localDisplayMetrics = resources.getDisplayMetrics();

        if ("EN".equals(localObject1)) {
            localConfiguration.locale = Locale.ENGLISH;
        }
        if ("CN".equals(localObject1)) {
            localConfiguration.locale = Locale.CHINESE;
        }
        if ("TW".equals(localObject1)) {
            localConfiguration.locale = Locale.TAIWAN;
        }
        resources.updateConfiguration(localConfiguration, localDisplayMetrics);
    }

    
}

這裡我用sp來儲存使用者手動切換的語言,在登入app時我進行判斷從而決定要顯示的語言
這裡的獲取語言我是在我的string資源裡面設定的,不同系統語言下獲取的值是不一樣的
在這裡插入圖片描述
這裡分別對應的語言是 英語,中文,繁體,繁體

LanguageChangeActivity 切換語言

public class LanguageChangeActivity extends Activity{
    String flag = null;
    private RadioGroup radioGroup_Language;
    private RadioButton radio_cn;
    private RadioButton radio_en;
    private RadioButton radio_fa;
    private SharedPreferences rememberUser;
    private SharedPreferences.Editor edit;
    

    @Override
    public int onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_language_change);
        initData();
        initListener();
    }

    @Override
    protected void initData() {
        flag = getResources().getString(lable_lang).trim();
        radioGroup_Language = findViewById(R.id.radioGroup_Language);
        radio_cn = findViewById(R.id.radio_cn);
        radio_en = findViewById(R.id.radio_en);
        radio_fa = findViewById(R.id.radio_fa);
       
        if ("CN".equals(flag)) {
            radio_cn.setChecked(true);
        }
        if ("EN".equals(flag)) {
            radio_en.setChecked(true);
        }
        if("TW".equals(flag)){
            radio_fa.setChecked(true);
        }


    }

    @Override
    protected void initListener() {
        radioGroup_Language.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId){
                    case R.id.radio_cn:
                         flag = "CN";
                         break;
                    case R.id.radio_en:
                        flag = "EN";
                        break;
                    case R.id.radio_fa:
                        flag = "TW";
                        break;
                }
                Configuration localConfiguration;
                DisplayMetrics localDisplayMetrics;
                Resources resources = getResources();
                localConfiguration = resources.getConfiguration();
                localDisplayMetrics = resources.getDisplayMetrics();
                if ("EN".equals(flag)) {
                    localConfiguration.locale = Locale.ENGLISH;
                }
                if ("CN".equals(flag)) {
                    localConfiguration.locale = Locale.CHINESE;
                }
                if("TW".equals(flag)){
                    localConfiguration.locale = Locale.TAIWAN;
                }
                //獲取模式
                rememberUser = getSharedPreferences(Contast.TABLE_TABLE, MODE_PRIVATE);
                edit = rememberUser.edit();
                edit.putString(Contast.TABLE_LANGUAGE, flag);
                edit.commit();

                resources.updateConfiguration(localConfiguration, localDisplayMetrics);
                finish();
                //清空任務棧
                Intent intent = new Intent(LanguageChangeActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
            }
        });
    }
}

這裡用sp來儲存使用者手動設定的語言
activity_language_change.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@color/grayWhite"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".activity.LanguageChangeActivity">
  
    <RadioGroup android:id="@+id/radioGroup_Language"
        android:layout_width="match_parent"
        android:layout_marginLeft="5dp"
        android:layout_height="wrap_content">
        <RadioButton android:id="@+id/radio_cn"
            android:textSize="16sp"
            android:background="@color/white"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:checked="true"
            android:text="@string/lable_china" />
        <View android:background="@color/item_boderLine"
            android:layout_width="match_parent"
            android:layout_height="1dp" />
        <RadioButton android:id="@+id/radio_en"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="@color/white"
            android:textSize="16sp"
            android:text="@string/lable_english" />
        <View android:background="@color/item_boderLine"
            android:layout_width="match_parent"
            android:layout_height="1dp" />
        <RadioButton android:id="@+id/radio_fa"
            android:layout_width="match_parent"
            android:textSize="16sp"
            android:layout_height="50dp"
            android:background="@color/white"
            android:text="@string/lable_fanti" />
    </RadioGroup>
</LinearLayout>

歐克,這就結束了 是不是很簡單 ,