1. ホーム
  2. android

Android - Android 7.0以降でWebViewの言語が突然変更される。

2023-09-12 12:09:59

質問

第一言語が英語、第二言語がアラビア語の多言語アプリを持っています。

に記載されているように ドキュメント ,

  • を追加しました。 android:supportsRtl="true" をマニフェストに追加しました。
  • ですべての xml プロパティを変更しました。 leftright 属性から startend をそれぞれ指定します。
  • にアラビア語の文字列を追加しました。 strings-ar に追加しました (他のリソースについても同様です)。

上記の設定は正しく動作します。を変更した後 Localear-AE に変更すると、アラビア語のテキストとリソースがアクティビティに正しく表示されるようになりました。

しかし Activity に移動するたびに WebView または WebViewClient である場合、ロケール、テキスト、レイアウト方向は は突然デバイスのデフォルトに戻ります。

さらにヒントがあります。

  • この現象は だけ でNexus 6Pに Android 7.0 . Android 6.0.1 以下では、すべて正常に動作します。
  • ロケールの突然の移動が発生する だけ に移動すると Activity を持つ WebViewWebViewClient (のどちらかで発生します(複数あります)。他のアクティビティでは発生しません。

Android 7.0 はマルチロケールをサポートしており、ユーザーが複数のデフォルトロケールを設定することができます。そのため、プライマリ ロケールを Locale.UK :

に移動すると WebView に移動すると、ロケールは ar-AE から en-GB .

Android 7.0のAPIの変更点です。

で示したように API 変更点リスト にあるように、API24では以下のクラスにロケールに関連する新しいメソッドが追加されました。

Locale :

Configuration :

<ブロッククオート

しかし、私はAPI 23でアプリを構築しており、これらの新しいメソッドを使用していません。 これらの新しいメソッドは使用していません。

さらに ...

  • この問題は、Nexus 6P エミュレータでも発生します。

  • デフォルトのロケールを取得するために、私は Locale.getDefault() .

  • デフォルトのロケールを設定するために、以下のコードを使用しています。

    public static void setLocale(Locale locale){
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.setLocale(locale);
        Context context = MyApplication.getInstance();
        context.getResources().updateConfiguration(config,
                context.getResources().getDisplayMetrics());
    }
    
    

この問題に遭遇したことのある方はいらっしゃいますか?また、どのように解決すればよいのでしょうか?

リファレンスです。

1. Android 4.2でのネイティブRTLサポート .

2. 多言語対応 - 言語とロケール .

3. デフォルトのロケールに注意 .

どのように解決するのですか?

テッド・ホップ氏の回答 は、なんとか問題を解決してくれたのですが、次のような疑問には答えてくれませんでした。 なぜ が発生するのか。

の変更に起因するものです。 WebView クラスとそのサポートパッケージが Android 7.0 で変更されたためです。

背景です。

アンドロイドの WebView を使って構築されています。 WebKit . 元々は AOSP の一部でしたが、KitKat 以降は WebView という別のコンポーネントに分離することが決定されました。 Android システム WebView . これは、基本的に Android デバイスにプレインストールされている Android システム アプリです。Google Play サービスや Play ストア アプリなど、他のシステム アプリと同様に定期的に更新されます。インストールされているシステム アプリのリストで確認できます。

Android 7.0 の変更点 :

Android N からは、Chrome アプリが、あらゆる/すべての WebView のレンダリングに使用されます。Android N を最初から搭載している電話機では、Android WebView システム アプリはまったく存在しません。Android NへのOTAアップデートを受けたデバイスでは、Android System WebViewは無効になります。

そして

さらに、マルチロケールサポートが導入され、複数のデフォルト言語を持つデバイスに対応しました。

これは、複数の言語を持つアプリにとって重要な結果をもたらします。もしアプリが WebView がある場合、これらは Chrome アプリを使用してレンダリングされます。ChromeはAndroidアプリであるため それ自体 であり、独自のサンドボックス プロセスで実行されるため、アプリによって設定されたロケールに拘束されません。その代わり、Chrome は主要なデバイスのロケールに戻ります。たとえば、アプリのロケールが次のように設定されているとします。 ar-AE に設定されており、デバイスのプライマリロケールが en-US . この場合、ロケールは Activity を含む WebView から ar-AE から en-US と入力すると、対応するロケールフォルダ内の文字列やリソースが表示されます。LTRとRTLの文字列やリソースが混在して表示されるかもしれません。 Activity を持つ WebView s.

解決策

この問題の完全な解決策は2つのステップで構成されています。

ステップ1:

まず、デフォルトロケールを手動でリセットして、すべての Activity で、あるいは少なくともすべての Activity を持つものであれば WebView .

public static void setLocale(Locale locale){
    Context context = MyApplication.getInstance();
    Resources resources = context.getResources();
    Configuration configuration = resources.getConfiguration();
    Locale.setDefault(locale);
    configuration.setLocale(locale);

    if (Build.VERSION.SDK_INT >= 25) {
        context = context.getApplicationContext().createConfigurationContext(configuration);
        context = context.createConfigurationContext(configuration);
    }

    context.getResources().updateConfiguration(configuration,
            resources.getDisplayMetrics());
}

上記のメソッドを呼び出す前に setContentView(...) の中で onCreate() メソッドに追加します。その locale パラメータはデフォルトの Locale を指定します。たとえば、アラビア語/UAE をデフォルトのロケールとして設定したい場合は、パラメータに new Locale("ar", "AE") . また、デフォルトのロケールを設定したい場合 (すなわち Locale が自動的に設定されるもの) を設定したい場合は、その前に Locale.US .

STEP2です。

さらに、以下のコードの行を追加する必要があります。

new WebView(this).destroy();

の中に onCreate()Application クラス (もしあれば) の と、ユーザーが言語を変更する可能性のあるその他の場所です。これにより、言語を変更した後のアプリの再起動時に発生する可能性のあるあらゆるエッジケースに対処できます (言語を変更した後、他の言語や反対のアライメントを持つ文字列が Activities を持つ WebView がある場合)。

追記として Chrome カスタム タブ は現在、アプリ内の Web ページをレンダリングする好ましい方法です。

参考文献です。

1. Android 7.0 - の変更点 WebView .

2. WebViewとAndroidのセキュリティパッチを理解する .

3. Android用WebView .

4. WebView。"Powered by Chrome" からストレート アップ Chrome へ。 .

5. NougatのWebView .

6. Android 7.0 Nougat .

7. Android Nの謎、その1。Android System WebViewはただの"Chrome"になったのか? .