Android 國際化中出現的坑
阿新 • • 發佈:2019-01-27
前言
在做應用的過程中,國際化可以說是我們都會接觸的一塊。在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);
}
問題隨時記錄,方便日後查找回顧,謹記之。