Recursos e direção do layout renderizados incorretamente apenas no Android 8.0 e superior

Eu tenho um aplicativo multilíngue com o idioma principal inglês e o idioma secundário árabe.

eu estou chamandosetLocale() noonCreate() de todosActivity no meu aplicativo:

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

Ondelocale é um dos seguintes:

O método acima é chamadoantes super.onCreate(savedInstanceState) é chamado.

Conforme descrito nodocumentação,

Eu adicioneiandroid:supportsRtl="true" no manifesto.Alterei todas as propriedades xml comleft eright atributos parastart eend respectivamente.Eu coloquei cordas em áraberes\values-ar\strings pasta e recursos desenháveis emres\drawable-ar pasta (e da mesma forma para outros recursos).

A configuração acima funciona corretamente. Depois de alterar oLocale paraar-AE, Texto e recursos em árabe são exibidos corretamente em minhas atividades.

No entanto, há um problema com os recursos e a direção do layout para todos os dispositivos Android com versão8.0 e acima.

Em um dispositivo com versão inferior a 8.0, uma tela RTLcorretamente se parece com isso:

E em todos os dispositivos com 8.0+, a mesma tela aparece assim:

qual éerrado.

Acontece que a direção e os recursos estão sendo exibidos incorretamente.

temdois problemas aqui:

O corretoLocale parece não estar atualizado na configuração do aplicativo.A direção do texto e dos desenhos é oposta ao que deveria ser.

Com relação à direção, um método curioso chamadosetLayoutDirection() existe que eu não tinha notado antes.

Gostaria de saber qual é esse problema, por que acontece no Oreo e qual é a solução para ele. Por favor, ajude / comente sobre isso.

EDITAR:

De acordo comRelatório de diferenças de API, aupdateConfiguration() O método foi realmente preterido no Android 7.1 (nível 25 da API).

Além disso, encontrou todas as postagens relevantes sobre isso. Por ordem de importância:

1 Android N alterar idioma programaticamente.

2) Android context.getResources.updateConfiguration () descontinuado.

3) Como alterar o idioma do aplicativo Android O / Oreo / api 26.

4) Problema de RTL do Android na API 24 e superior na alteração de localidade

5) Alterar idioma programaticamente (Android N 7.0 - API 24).

6 Android N - Alterar localidade em tempo de execução.

7) Erro de layout RTL no Android Oreo.

questionAnswers(5)

yourAnswerToTheQuestion