前言
在做应用的过程中,国际化可以说是我们都会接触的一块。在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),通过注释可以看出其作用是强制保存当前的状态;
解决方法
可以参考下面这个回答
Not all items in the layout update properly when switching locales
因为要翻墙,所以作了下摘录,如下:
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);
}
问题随时记录,方便日后查找回顾,谨记之。