2017-09-19 2 views
5

Depuis que j'ai mis à niveau vers Android oreo sur mobile mon support RTL pour l'application ne fonctionne pas. il change les chaînes en arabe mais ne change pas la direction de mise en page. mais si je cours le même décalage RTL vers n'importe quel appareil inférieur à Oero, tout fonctionne bien. quelqu'un d'autre a connu ce problème? Existe-t-il une déclaration officielle sur ce bug et cette solution de contournement?RTL mise en page bug dans android Oreo

ci-dessous est ma méthode pour modifier les paramètres régionaux

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

Avez-vous activé RTL dans le manifeste? –

+0

@SamuelRobert: oui android: supportsRtl = "vrai" –

+0

@SamuelRobert: juste pour effacer le fait, tout fonctionne bien comme prévu même la mise en page RTL Shifting ci-dessous, mais pas dans les appareils oreo. –

Répondre

3

Merci à @amorenew et pincé la méthode en classe Util pour soutenir des cette étrange mise à jour dans oreo ci-dessous est la méthode de travail que vous avez juste à appeler cette méthode onResume chaque fois que l'utilisateur change la préférence de langue de l'application

/** 
* 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

Vous devriez accepter la réponse de @amorenew –

4

fix simple dans votre fonction onCreate ajoutez le code suivant:

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