1. 程式人生 > >Android 國際化中出現的坑

Android 國際化中出現的坑

前言

在做應用的過程中,國際化可以說是我們都會接觸的一塊。在res資料夾下建立對應國家的values資料夾(可以參考國際化命名規則),裡面放上各自語言的strings.xml檔案即可

這裡不講國際化,只是記錄系統語言發生改變時,應用中語言應用中出現的一個問題,也許還有其他也說不定。

問題

在應用介面開啟系統設定更改系統語言,RadioButton 和 CheckBox 在重建之後沒有更改語言

原因分析

以下是找的不同原始碼中的片段

Android 4.4.2 Api 19

@Override
public Parcelable onSaveInstanceState
() { // Force our ancestor class to save its state setFreezesText(true); Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.checked = isChecked(); return ss; }

Android 4.4W.2 Api 20

@Override
public Parcelable onSaveInstanceState
() { Parcelable superState = super.onSaveInstanceState(); SavedState ss = new SavedState(superState); ss.checked = isChecked(); return ss; }

Android 6.0 Api 23

@Override
public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();

    SavedState ss = new
SavedState(superState); ss.checked = isChecked(); return ss; }

從上可以看出,問題出現於Api 20以前,由於方法 setFreezesText(true),通過註釋可以看出其作用是強制儲存當前的狀態;

解決方法

public class CheckBoxNoPersistentText extends CheckBox {

    public CheckBoxNoPersistentText(final Context context) {
        super(context);
    }

    public CheckBoxNoPersistentText(final Context context, final AttributeSet attrs) {
        super(context, attrs);
    }

    public CheckBoxNoPersistentText(final Context context, final AttributeSet attrs, final int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onRestoreInstanceState(final Parcelable state) {

        final CharSequence text = getText(); // the text has been resolved anew

        super.onRestoreInstanceState(state); // this restores the old text

        setText(text); // this overwrites the restored text with the newly resolved text

    }
}

最直接簡單粗暴的方式是:
在當前未改變的Activity的onResume()中找到未變化的控制元件設定其text即可,例如:

@Override
protected void onResume() {
    super.onResume();
    my_recorder.setText(R.string.my_recorder);
    recorder_manager.setText(R.string.recorder_manager);
    recorder_upload.setText(R.string.recorder_upload);
}

問題隨時記錄,方便日後查找回顧,謹記之。