Android 国际化中出现的坑

来源:互联网 发布:mysql下载32位 win7 编辑:程序博客网 时间:2024/05/18 00:08

前言

在做应用的过程中,国际化可以说是我们都会接触的一块。在res文件夹下建立对应国家的values文件夹(可以参考国际化命名规则),里面放上各自语言的strings.xml文件即可

这里不讲国际化,只是记录系统语言发生改变时,应用中语言应用中出现的一个问题,也许还有其他也说不定。

问题

在应用界面打开系统设置更改系统语言,RadioButton 和 CheckBox 在重建之后没有更改语言

原因分析

以下是找的不同源码中的片段

Android 4.4.2 Api 19

@Overridepublic 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

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

Android 6.0 Api 23

@Overridepublic 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即可,例如:

@Overrideprotected 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);}

问题随时记录,方便日后查找回顾,谨记之。

0 0
原创粉丝点击