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),通过注释可以看出其作用是强制保存当前的状态;

解决方法

可以参考下面这个回答
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);
}

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

猜你喜欢

转载自blog.csdn.net/hehota/article/details/54585263