Изменения конфигурации Android приводят к изменению направления макета

У меня проблема с некоторыми устройствами, такими как Note3, проектирование только в портретном режиме.У меня есть поддержка как RTL, так и LTR, когда я меняю язык приложения на RTL, он работает нормально, но когда я делаю фотографию с камерой, устройство вращается и при возврате к приложению приложение игнорирует определенный языковой стандарт и использует языковой стандарт устройства, который является английским, и направление приложения изменяется на LTR, но со строками RTL, пока вы не перейдете на другой экран, все приложение станет LTR, и это произойдет только тогда, когда языковой стандарт устройства - только английский. если языковой стандарт устройства - арабский, этого не происходит. Вот мой код для локали

public class MvpApp extends Application {
AppDataManager dataManager;
private Locale locale = null;
private String language;

@Override
public void onCreate() {
    super.onCreate();

    Fresco.initialize(this);
    final Fabric fabric = new Fabric.Builder(this)
            .kits(new Crashlytics())
            .debuggable(true)
            .build();
    Fabric.with(fabric);
    AppPreferencesHelper preferencesHelper = new AppPreferencesHelper(getApplicationContext());
    ApiModule apiModule = new ApiModule(getApplicationContext());
    dataManager = new AppDataManager(getApplicationContext(),
            preferencesHelper, apiModule.provideApiService());

    String lang = dataManager.getLanguage();

    if (lang == null)
        language = "en";
    else language = lang;

    LocaleHelper.setLocale(getApplicationContext(),language);


}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (locale != null) {
        newConfig.locale = locale;
        Locale.setDefault(locale);
        newConfig.setLayoutDirection(locale);
        getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
    }
}


public AppDataManager getDataManager() {
    return dataManager;
}

и вспомогательный класс локали

public class LocaleHelper {

public static Context onAttach(Context context, String language) {
    return setLocale(context, language);
}

public static Context setLocale(Context context, String localeSpec) {
    Locale locale = new Locale(localeSpec);
    Locale.setDefault(locale);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return updateResources(context, locale);
    } else {
        return updateResourcesLegacy(context, locale);
    }

}

@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, Locale locale) {
    Configuration configuration = context.getResources().getConfiguration();
    configuration.setLocale(locale);
    configuration.setLayoutDirection(locale);

    return context.createConfigurationContext(configuration);
}

@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, Locale locale) {
    Resources resources = context.getResources();

    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    configuration.setLayoutDirection(locale);
    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    return context;
}

}


person Assem Mahrous    schedule 01.10.2018    source источник


Ответы (1)


Мне удалось преодолеть эту проблему, но переопределив onConfigurationChanged в действиях и добавив в манифест эту строку

android:configChanges="orientation|screenSize|layoutDirection|locale"

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Locale locale = new Locale(presenter.getLanguage());
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        newConfig.setLocale(locale);
        Locale.setDefault(locale);
        newConfig.setLayoutDirection(locale);
        this.createConfigurationContext(newConfig);
    } else {
        newConfig.locale = locale;
        Locale.setDefault(locale);
        newConfig.setLayoutDirection(locale);
        getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
    }
}
person Assem Mahrous    schedule 03.10.2018