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).