多语言切换中遇到的坑:
以静态变量的方式,在 Application 初始化时初始化网络请求错误提示
语,然后再系统中切换语言后,网络请求错误提示语未更新。
解决办法:使用时直接通过 getString() 方法获取
App 多语言切换设置持久化后,在应用启动时,
Application 的 onCreate() 中也进行了多语言切换。
然后去系统设置中切换语言,App 也会随之跟随系统语言。
原因:在我们改变系统的语言时,应用的 Configuration 也随之跟随系
统改变,而不是我们启动应用时的设置了解决办法:监听 Activity
的生命周期, 在 Activty 的 onCreate() 中判断应用当前的语言设
置是否与用户设置值相同,否则强制更新应用语言设置。因为
,当系统切换语言选项的时候,系统会重启 Activity,就如前文所
说,我们需要重启 Activity 才能实现资源的重新加载一样。
这里也有两种方案:
1. 创建一个基类 BaseActivity ,在其 onCreate() 方法中做处理
使用 ActivityLifecycleCallbacks ,在其回调 onActivityCreated()
中做处理, 只能针对继承自 BaseActivity 的才有效.
2. 监听所以 Activity 的生命周期.相对而言,第二种方案更好点。
/**
* 判断是否与设定的语言相同.
*
* @param context
* @return
*/
public static boolean isSameWithSetting(Context context) {
Locale current = context.getResources().getConfiguration().locale;
return current.equals(getAppLocale(context));
}
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
LanguageUtil.init(this);
//注册Activity生命周期监听回调
registerActivityLifecycleCallbacks(callbacks);
}
ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
//强制修改应用语言
if (!LanguageUtil.isSameWithSetting(activity)) {
LanguageUtil.changeAppLanguage(activity,
LanguageUtil.getAppLocale(activity));
}
}
//Activity 其它生命周期的回调
};
}
对于在 AndroidManifest.xml 中配置 launchMode 为 singleInstance 的Activity,使用
Intent intent = new Intent(this, MainActivity.class);
//开始新的activity同时移除之前所有的activity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
资源文件不更新。
原因:launchMode 为 singleInstance 的 Activity 与当前应用时不在同
一个 Task 栈解决方法:将 launchMode 改为其它
模式或者杀掉应用重新启动资源文件夹为 values-zh-rCN时,
将应用 Locale 设置为Locale.CHINESE 时
找不到对应的资源文件。
原因:values-zh-rCN 对应的 Locale 为 Locale.SIMPLIFIED_CHINESE
解决办法:将 Locale 设置为 Locale.SIMPLIFIED_CHINESE 或者
将资源文件改为 values-zh这是踩得最惨的一个坑,浪费了大量时
间,所以才会有开头 Android 应用资源国际化 那么一小节插曲。
网友评论