Android RTL issue in API 24 and higher on locale change

后端 未结 2 1034
独厮守ぢ
独厮守ぢ 2021-01-06 14:49

I was trying to change locale of app at runtime. It is working fine in Andorid below API level 24. But in API level 24 or greater the layout direction is not changing accord

2条回答
  •  挽巷
    挽巷 (楼主)
    2021-01-06 14:56

    package www.ourshopee.com.utils;
    
    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.res.Configuration;
    import android.content.res.Resources;
    import android.os.Build;
    import android.preference.PreferenceManager;
    import android.support.annotation.RequiresApi;
    import android.util.Log;
    
    import java.util.Locale;
    
    public class LocaleHelper {
    
        private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
    
        public static void onCreate(Context context) {
            String lang = getPersistedData(context, Locale.getDefault().getLanguage());
            setLocale(context, lang);
        }
    
        public static void onCreate(Context context, String defaultLanguage) {
            String lang = getPersistedData(context, defaultLanguage);
            setLocale(context, lang);
        }
    
        public static String getLanguage(Context context) {
            return getPersistedData(context, Locale.getDefault().getLanguage());
        }
    
        public static void setLocale(Context context, String language) {
            persist(context, language);
    
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 updateResources(context, language);
            }
    
               updateResourcesLegacy(context, language);
    
    
    
    
    
    
        }
    
        private static String getPersistedData(Context context, String defaultLanguage) {
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
            return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
        }
    
        private static void persist(Context context, String language) {
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
            SharedPreferences.Editor editor = preferences.edit();
    
            editor.putString(SELECTED_LANGUAGE, language);
            editor.apply();
        }
    
    
    
    //    private static void updateResources(Context context, String language) {
    //
    //
    //
    //
    //
    //        Locale locale = new Locale(language);
    //        Locale.setDefault(locale);
    //        Configuration config = context.getResources().getConfiguration();
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    //            config.setLocale(locale);
    //        }
    //        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    //            context.createConfigurationContext(config);
    //        }
    //        context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    //
    //
    //
    //
    //
    //
    //    }
    
    
    
    
    
    
    
        @TargetApi(Build.VERSION_CODES.N)
        private static Context updateResources(Context context, String language) {
            Locale locale = new Locale(language);
            Log.d("LocaleHelper", "language above 24: "+language);
            Locale.setDefault(locale);
    
            Configuration configuration = context.getResources().getConfiguration();
            configuration.setLocale(locale);
            configuration.setLayoutDirection(locale);
            return context.createConfigurationContext(configuration);
        }
    
        @SuppressWarnings("deprecation")
        private static Context updateResourcesLegacy(Context context, String language) {
            Locale locale = new Locale(language);
            Log.d("LocaleHelper", "language below 24: "+language);
            Locale.setDefault(locale);
    
            Resources resources = context.getResources();
    
            Configuration configuration = resources.getConfiguration();
            configuration.locale = locale;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                configuration.setLayoutDirection(locale);
            }
            resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    
            return context;
        }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    }
    

提交回复
热议问题