第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android-WebView語言在Android 7.0及更高版本上突然改變

Android-WebView語言在Android 7.0及更高版本上突然改變

呼喚遠(yuǎn)方 2019-12-27 11:02:31
我有使用主要語言英語和次要語言阿拉伯語的多語言應(yīng)用程序。如文檔中所述,我已經(jīng)添加android:supportsRtl="true"了清單。我已將所有xml屬性分別與left和right屬性分別更改為start和end。我在中添加了阿拉伯語言字符串strings-ar(其他資源也是如此)。上面的設(shè)置可以正常工作。將更Locale改為后ar-AE,阿拉伯文和資源會正確顯示在我的活動中。但是,每次我Activity使用WebView 和和/或?qū)Ш降綍rWebViewClient,語言環(huán)境,文本和布局方向都會突然恢復(fù)為設(shè)備默認(rèn)值。更多提示:這僅在具有Android 7.0的Nexus 6P上發(fā)生。一切在Android 6.0.1及更低版本上均可正常運(yùn)行。僅當(dāng)我導(dǎo)航到Activity具有WebView和(或)WebViewClient(并且我有多個)的時,才會發(fā)生語言環(huán)境的突然變化。在任何其他活動上都不會發(fā)生。Android 7.0支持多語言環(huán)境,允許用戶設(shè)置多個默認(rèn)語言環(huán)境。因此,如果我將主要語言環(huán)境設(shè)置為Locale.UK:在此處輸入圖片說明然后在導(dǎo)航到時WebView,語言環(huán)境從更改ar-AE 為en-GB。Android 7.0 API更改:如API更改列表中所示,與語言環(huán)境有關(guān)的新方法已添加到API 24中的以下類:Locale:Locale.getDefault(...)Locale.setDefault(...)Configuration:getLocales()setLocales(...)但是,我正在使用API 23構(gòu)建我的應(yīng)用程序,并且沒有使用任何這些新方法。此外...Nexus 6P仿真器上也會發(fā)生此問題。要獲取默認(rèn)語言環(huán)境,我正在使用Locale.getDefault()。要設(shè)置默認(rèn)語言環(huán)境,我使用以下代碼: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());}有人遇到過這個問題嗎?原因是什么,我該如何解決?
查看完整描述

3 回答

?
慕慕森

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個贊

背景:


Android WebView是使用WebKit構(gòu)建的。雖然它最初是AOSP的一部分,但從KitKat開始,便決定將其WebView拆分為一個名為Android System WebView的單獨(dú)組件。本質(zhì)上,它是一個預(yù)裝有Android設(shè)備的Android系統(tǒng)應(yīng)用。就像其他系統(tǒng)應(yīng)用(例如Google Play服務(wù)和Play商店應(yīng)用)一樣,它會定期更新。您可以在已安裝的系統(tǒng)應(yīng)用程序列表中看到它:


Android系統(tǒng)WebView


Android 7.0的變化:


從Android N開始,Chrome應(yīng)用將用于渲染W(wǎng)ebView第三方Android應(yīng)用中的任何/全部。在開箱即用的Android N手機(jī)中,根本沒有Android WebView System應(yīng)用程序。在已收到Android N的OTA更新的設(shè)備中,Android系統(tǒng)WebView被禁用:


WebView已禁用



WebView已禁用


此外,已引入多語言環(huán)境支持,并且設(shè)備具有多種默認(rèn)語言:


在此處輸入圖片說明


對于具有多種語言的應(yīng)用程序,這具有重要的意義。如果您的應(yīng)用包含WebView,則這些內(nèi)容將使用Chrome應(yīng)用呈現(xiàn)。由于Chrome 本身就是一個Android應(yīng)用,因此以其自己的沙盒流程運(yùn)行,因此不會綁定到您的應(yīng)用設(shè)置的語言環(huán)境。取而代之的是,Chrome將還原為主要設(shè)備的語言環(huán)境。例如,假設(shè)您的應(yīng)用語言環(huán)境設(shè)置為ar-AE,而設(shè)備的主要語言環(huán)境設(shè)置為en-US。在這種情況下,Activity包含的語言環(huán)境WebView將從ar-AE變?yōu)閑n-US,并且將顯示來自相應(yīng)語言環(huán)境文件夾的字符串和資源。您可能會在Activity具有WebViews的那些s 上看到大量的LTR和RTL字符串/資源。


解決方案:


完整的解決方案包括兩個步驟:


步驟1:


首先,在每個Activity(或至少每個Activity具有的)中手動重置默認(rèn)語言環(huán)境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());

}

在調(diào)用之前調(diào)用上面的方法setContentView(...)在onCreate()所有的活動的方法。該locale參數(shù)應(yīng)該是Locale您希望設(shè)置的默認(rèn)值。例如,如果您希望將阿拉伯語/阿拉伯聯(lián)合酋長國設(shè)置為默認(rèn)語言環(huán)境,則應(yīng)傳遞new Locale("ar", "AE")?;蛘?,如果您希望設(shè)置默認(rèn)語言環(huán)境(即Locale由操作系統(tǒng)自動設(shè)置的語言環(huán)境),則應(yīng)通過Locale.US。


第2步:


此外,您需要添加以下代碼行:


new WebView(this).destroy();

在onCreate()您的Application類(如果有的話),和任何其他地方的用戶可以更改語言。這將處理在更改語言后重新啟動應(yīng)用程序時可能發(fā)生的各種極端情況(您可能已經(jīng)注意到其他語言的字符串,或者在更改語言后在Android 7.0 ++ 上Activities具有相反的對齊方式WebView)。


作為附錄,Chrome自定義標(biāo)簽現(xiàn)在是呈現(xiàn)應(yīng)用內(nèi)網(wǎng)頁的首選方式。


查看完整回答
反對 回復(fù) 2019-12-27
?
炎炎設(shè)計(jì)

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個贊

您的代碼似乎正在為應(yīng)用本身(MyApplication.getInstance())的配置中設(shè)置語言環(huán)境。但是,您需要在擴(kuò)展活動的內(nèi)容視圖之前更新活動上下文的配置。我發(fā)現(xiàn)修改應(yīng)用程序的上下文是不夠的(事實(shí)證明,甚至沒有必要)。如果我不更新每個活動上下文,則行為在各個活動之間是不一致的。


我采用的方法是子類化AppCompatActivity(或者Activity,如果不使用兼容性庫,則使用子類化),然后從該子類派生我的所有活動類。這是我的代碼的簡化版本:


public class LocaleSensitiveActivity extends AppCompatActivity {

    @Override protected void onCreate(Bundle savedInstanceState) {

        Locale locale = ... // the locale to use for this activity

        fixupLocale(this, locale);

        super.onCreate(savedInstanceState);

        ...

    }


    static void fixupLocale(Context ctx, Locale newLocale) {

        final Resources res = ctx.getResources();

        final Configuration config = res.getConfiguration();

        final Locale curLocale = getLocale(config);

        if (!curLocale.equals(newLocale)) {

            Locale.setDefault(newLocale);

            final Configuration conf = new Configuration(config);

            conf.setLocale(newLocale);

            res.updateConfiguration(conf, res.getDisplayMetrics());

        }

    }


    private static Locale getLocale(Configuration config) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

            return config.getLocales().get(0);

        } else {

            //noinspection deprecation

            return config.locale;

        }

    }

}

然后,在調(diào)用使用上下文的任何方法(例如)之前,請確保先調(diào)用super.onCreate(savedInstanceState)每個子類的onCreate()方法。setContentView()


查看完整回答
反對 回復(fù) 2019-12-27
  • 3 回答
  • 0 關(guān)注
  • 1386 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號