正常切换语言时,android系统会自动重新创建Activity重新加载资源,这是语言时可以自动改变。但当在Service中或其他地方通过WindowManager添加一个Window时,切换语言是不会自动改变,因为WindowManager已加载Window不会再重新加载,这时就需要监听语言的变化动态设置布局控件的文本以及布局方向。
监听语言的改变可通过四大组件的onConfigurationChanged方法回调监听到语言的改变,或者监听Intent.ACTION_LOCALE_CHANGED广播。广播监听的方式如下,记得进行广播的反注册。
private BroadcastReceiver mLocaleBroadcastReceiver;
private void registerLocaleReceiver() {
if (mLocaleBroadcastReceiver == null) {
mLocaleBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mTvWindowTitle.setText(mContext.getString(R.string.window_title));
}
};
IntentFilter filter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
mContext.registerReceiver(mLocaleBroadcastReceiver, filter);
}
}
当切换为阿拉伯语言时(阿拉伯从右往左的浏览方向),发现Window布局方向也没有改变,此时需要动态设置布局方向。
mLayoutWindow.setLayoutDirection(isRtl() ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
其中isRtl()方法为判断当前语言的文本方向。
private boolean isRtl () {
return TextUtilsCompat.getLayoutDirectionFromLocale(getResources().getConfiguration().locale) == ViewCompat.LAYOUT_DIRECTION_RTL;
}
当然文本也有方向,阿拉伯语言时也有其他语言(英语)显示的情况,而TextView设置了match_parent或设置了指定宽度,此时英文会默认显示从左往右,而需求效果是同阿拉伯文从右往左显示,这时需要动态设置文本方向。
mTvWindowTitle.setTextDirection(isRtl() ? View.TEXT_DIRECTION_RTL : View.TEXT_DIRECTION_LTR);
同时阿拉伯语言需要注意图片的翻转,当用到了不对称的图片时,阿拉伯语言也需要进行翻转,android系统并不会自动翻转图片,此时需要准备翻转后的图片,放在drawable-ar-hdpi(不同密度对应不同目录)的资源目录下。
这里教给大家一个小技巧进行图片翻转而不需要依赖UI工程师切图。首先以Windows系统自动的画图3D软件打开图片,点击右上角查看更多选项,点击画布选择,在画布面板中最下方有旋转和翻转选项,点击第三个水平翻转,之后点击菜单另存为图像保存,这样就生成翻转的图片了。
当遇到俄语等这种超长语言时,会出现文本显示不全的情况,此时需要进行超长文本适配。有两种方案:
第一种,建立不同语言的资源文件
可以适当减小语言文本较长的控件的文本大小,新建values-ru资源目录,调整文本大小到合适的显示效果(window窗口需要动态设置文本大小)。同时尽量使用wrap_content属性来达到文本适应,也可以新建layout-ru来创建语言的布局。
第二种,跑马灯效果
跑马灯的实现参考这篇博客