Android-WebView语言在Android 7.0及以上版本上突然发生变化

我有一个多语言应用程序,主要语言为英语,次要语言为阿拉伯语

如文件所述

  • 我在清单中添加了android:supportsRtl=“true”
  • 我已将所有带有leftright属性的xml属性分别更改为startend
  • 我在strings ar中添加了阿拉伯语字符串(对于其他资源也是如此)

上述设置工作正常。将Locale更改为ar AE后,阿拉伯文&资源在“我的活动”中正确显示

但是,每次我使用网络视图导航到活动
和/或WebViewClient,区域设置、文本和布局方向
突然恢复到设备默认值

进一步提示:

  • 这只发生在Nexus 6P和Android 7.0上。在Android 6.0.1及以下版本上,一切都正常工作
  • 当我导航到一个具有WebView和/或WebViewClient活动时,区域设置的突然变化才会发生。它不会发生在任何其他活动中

Android 7.0支持多语言环境,允许用户设置多个默认语言环境。因此,如果我将主语言环境设置为locale.UK

然后导航到WebView,区域设置从ar AE
en GB

Android 7.0 API更改:

如API变更列表所示,与locale相关的新方法已添加到API 24中的以下类中:

语言环境

  • Locale.getDefault(…)
  • Locale.setDefault(…)

配置

  • getLocales()
  • setLocales(…)

但是,我正在使用API 23构建我的应用程序,并且没有使用任何
这些新方法

此外…

  • 这个问题也发生在Nexus6p模拟器上

  • 要获取默认区域设置,我使用locale.getDefault()

  • 要设置默认区域设置,我使用以下代码:

    公共静态void setLocale(Locale){
    setDefault(Locale);
    配置配置=新配置();
    config.setLocale(locale);
    Context=MyApplication.getInstance();
    context.getResources().updateConfiguration(配置、,
    context.getResources().getDisplayMetrics());
    }

以前有人遇到过这个问题吗?原因是什么?我该如何解决

参考文献:

1.Android 4.2中的本地RTL支持

2.多语言支持-语言和区域设置

3.注意默认的区域设置

特德·霍普的回答设法解决了这个问题,但他没有回答为什么会发生这种情况的问题

原因是对Android 7.0中的WebView类及其支持包进行了更改

背景:

Android的WebView是使用WebKit构建的。虽然它最初是AOSP的一部分,但从KitKat开始,决定将WebView拆分为一个单独的组件,称为Android系统WebView。它本质上是一款安卓系统应用程序,预装了安卓设备。它会定期更新,就像谷歌Play Services和Play Store应用程序等其他系统应用程序一样。您可以在已安装的系统应用程序列表中看到它:

Android 7.0的变化

从安卓N开始,Chrome应用程序将用于在第三方安卓应用程序中呈现任何/所有WebViews。在装有安卓N开箱即用的手机中,安卓WebView系统应用程序根本不存在。在已接收到Android N的OTA更新的设备中,Android系统WebView被禁用:

此外,还引入了多语言环境支持,设备具有多种默认语言:

这对于使用多种语言的应用程序来说是一个重要的结果。如果您的应用程序具有WebViews,则这些将使用Chrome应用程序进行渲染。因为Chrome本身就是一个Android应用程序,运行在自己的沙盒进程中,所以它不会绑定到应用程序设置的区域设置。相反,Chrome将恢复为主设备区域设置。例如,假设您的应用程序区域设置为ar AE,而设备的主要区域设置为en US。在这种情况下,包含WebView活动的区域设置将从ar AE更改为en US,并显示相应区域设置文件夹中的字符串和资源。在那些具有WebViews的Activitys上,您可能会看到LTR和RTL字符串/资源混杂在一起

解决方案:

此问题的完整解决方案包括两个步骤:

第1步:

首先,在每个活动中手动重置默认区域设置,或者至少在每个具有网络视图活动中手动重置默认区域设置

公共静态void setLocale(Locale){
Context=MyApplication.getInstance();
Resources=context.getResources();
配置=resources.getConfiguration();
setDefault(Locale);
setLocale(locale);
如果(Build.VERSION.SDK_INT>=25){
context=context.getApplicationContext().createConfigurationContext(配置);
context=context.createConfigurationContext(配置);
}
context.getResources().updateConfiguration(配置、,
getDisplayMetrics());
}

在调用所有活动的onCreate()方法中的setContentView(…)之前,先调用上述方法。locale参数应该是您希望设置的默认locale。例如,如果希望将阿拉伯语/UAE设置为默认语言环境,则应传递新语言环境(“ar”、“AE”)。或者,如果您希望设置默认区域设置(即操作系统自动设置的locale),则应传递locale.US

第二步:

此外,还需要添加以下代码行:

新建WebView(this.destroy();

应用程序类的onCreate()中(如果有),以及用户可能正在更改语言的任何其他位置。这将解决在更改语言后重新启动应用程序时可能出现的各种边缘情况(您可能注意到在Android 7.0++上具有WebViews的Activities上更改语言后,其他语言中的字符串或具有相反对齐方式的字符串)

作为补充,Chrome自定义选项卡现在是呈现应用程序内网页的首选方式

参考文献:

1.Android 7.0-对网络视图的更改

2.了解WebView和Android安全补丁

3.适用于Android的WebView

4.网络视图:从“由Chrome提供动力”到直接使用Chrome

5.牛轧糖网络视图

6.安卓7.0牛轧糖

7.安卓N之谜,第1部分:安卓系统WebView现在只是“Chrome”?

发表评论