2017-09-19 41 views
5

Odkąd uaktualniłem do Androida oreo na telefonie komórkowym, moja obsługa RTL dla aplikacji nie działa. zmienia łańcuchy na arabski, ale nie zmienia kierunku układu. ale jeśli uruchomię takie samo przesunięcie RTL do dowolnego urządzenia niższego niż oreo, wszystko działa dobrze. ktoś jeszcze doświadczył tego problemu? czy jest jeszcze jakieś oficjalne oświadczenie na temat tego błędu i sposobu jego obejścia?Błąd układu RTL w Androidzie Oreo

Poniżej jest moja metoda, aby zmienić ustawienia regionalne

public static boolean setDefaultLocale(Context context) { 
    Resources resources = context.getResources(); 
    PreferenceManager preferenceManager = PreferenceManager.getInstance(); 
    String localLanguage = resources.getConfiguration().locale.getLanguage(); 
    boolean isLanguageChanged = !preferenceManager.getCurrentLanguageCode().equalsIgnoreCase(localLanguage); 
    if (isLanguageChanged) { 
     Log.d("", preferenceManager.getCurrentLanguageCode()); 
     Locale locale = new Locale(preferenceManager.getCurrentLanguageCode()); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) 
      Locale.setDefault(Locale.Category.DISPLAY, locale); 
     else 
      Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     resources.updateConfiguration(config, resources.getDisplayMetrics()); 
     ((Activity) context).recreate(); 
    } 
    return isLanguageChanged; 
} 
+0

Czy włączono RTL w manifeście? –

+0

@SamuelRobert: yes android: supportsRtl = "true" –

+0

@SamuelRobert: tylko po to, aby wyczyścić fakt, wszystko działa poprawnie zgodnie z oczekiwaniami, nawet układ RTL Przesuwanie poniżej oreo, ale nie w urządzeniach Oreo. –

Odpowiedz

3

Dzięki @amorenew i manipulowane metodę w Util klasy wsparcia dla ta dziwna aktualizacja w oreo poniżej to metoda działania, którą należy wywołać w tej metodzie w trybie RESume, gdy użytkownik zmieni preferencję językową aplikacji.

/** 
* this to change app language to the saved language in user preferences 
* 
* @param context 
* @return 
*/ 
public static boolean setDefaultLocale(Context context, boolean isClearData) { 
    Resources resources = context.getResources(); 
    Resources resourcesApp = context.getApplicationContext().getResources(); 
    String localLanguage = resources.getConfiguration().locale.getLanguage(); 
    boolean isLanguageChanged = !PreferenceManager.getInstance().getCurrentLanguageCode().equalsIgnoreCase(localLanguage); 
    if (isLanguageChanged) { 
     Log.d("", PreferenceManager.getInstance().getCurrentLanguageCode()); 
     Locale locale = new Locale(PreferenceManager.getInstance().getCurrentLanguageCode()); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     resources.updateConfiguration(config, resources.getDisplayMetrics()); 
     resourcesApp.updateConfiguration(config, resources.getDisplayMetrics()); 
     //for API 25 
     Configuration configuration = resources.getConfiguration(); 
     configuration.setLocale(locale); 
     context.getApplicationContext().createConfigurationContext(configuration); 
     context.createConfigurationContext(configuration); 

     ((Activity) context).recreate(); 
     if (isClearData) { 
      CurrencyViewModel.getInstance().removeModel(); 
      CarNationalityViewModel.getInstance().removeModel(); 
      DialCodeViewModel.getInstance().removeModel(); 
     } 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
      ((Activity)context).getWindow().getDecorView().setLayoutDirection(Locale.getDefault().getLanguage().equalsIgnoreCase("ar") 
        ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); 
     } 
    } 
    return isLanguageChanged; 
} 
+0

Powinieneś zaakceptować odpowiedź @amorenew –

4

Proste poprawkę w onCreate funkcji dodaj następujący kod:

if (Locale.getDefault().getLanguage()=="ar") 
    getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 
else 
    getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_LTR);