Изменить язык приложения в зависимости от выбора пользователя - PullRequest
0 голосов
/ 11 мая 2018

Итак, у меня есть приложение, которое должно дать пользователю возможность выбирать язык приложения во время регистрации.

Пользователь регистрируется, выбирает язык из счетчика, и эта информация затемсохраняется на сервере / в SharedPreferences в виде строки.Например, «ro» для румынского и «en» для английского.

Поток такой: пользователь регистрируется и выбирает язык, переходит к экрану подтверждения SMS, а затем переходит в MainActivity, где создается экземплярФрагмент, который заполняет главный экран.

Именно в этом фрагменте я хотел бы, чтобы приложение отображалось на языке, выбранном пользователем во время регистрации.

У меня есть рабочий код,но это не оптимально - это работает не на всех устройствах.Даже страннее, код, который должен не быть совместимым с более новыми устройствами (Android 8), работает, но если я пишу код специально для этих устройств, он не работает.

Я былвчера просматривал StackOverflow весь день и до сих пор не может заставить его работать.

Вот некоторые фрагменты кода:

SplashActivity (первое действие, которое будет отображено - для этого требуетсяязык операционной системы и устанавливает его для приложения):

private void checkIsLoggedIn() {
    final UserInfo userInfo = complexPreferences.getObject("user_info", UserInfo.class);
    String language;

    if (userInfo != null) {
        language = userInfo.language;
    }
    else {
        String phoneLanguage = Locale.getDefault().getLanguage();
        if (phoneLanguage.equals("ro")) {
            language = "ro";
        } else {
            language = "en";
        }
    }

    setLocale(language);

public void setLocale(String lang) {

    Locale myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
}

Обратите внимание, что я знаю, что этот блок кода устарел для новых устройств, но он работает только один.

CodeVerificationPresenter:

private void callEditProfile() {
    api.editProfile(editProfileRequest)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new BaseObserver<LoginResponse>() {
                @Override
                public void onCompleted() {
                    super.onCompleted();
                }

                @Override
                public void onError(Throwable e) {
                    super.onError(e);
                    if (isViewAttached())
                        getView().showError(context.getString(R.string.could_not_update_profile));
                }

                @Override
                public void onNext(LoginResponse loginResponse) {
                    super.onNext(loginResponse);
                    if (loginResponse.success == 1) {
                        complexPreferences.putObject("user_info", loginResponse.userInfo);
                        if (image!=null)
                            changeImage(loginResponse.userInfo);
                        else
                            if (isViewAttached())
                                getView().requestSuccesful();
                    } else
                        if (isViewAttached() && !BaseApplication.isLogout) {
                            getView().showError(loginResponse.message);
                        }
                }
            });
}

Теперь у нас есть пользовательская информация в SharedPreferences.

MainActivity:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    injectDependencies();

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    drawerAdapter = component.adapter();
    recyclerView.setAdapter(drawerAdapter);

    if (getIntent().hasExtra("fromRegister")) {
        changeFragment(RestaurantListFragment.newInstanceFromRegister(true));
    } else {
        changeFragment(new RestaurantListFragment());
    }
}

Вызывается метод `changeFragment (RestaurantListFragment.newInstanceFromRegister (true));

В итоге мы получаем RestaurantListFragment , где это происходит:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ButterKnife.bind(this, view);
    adapter = component.adapter();
    locationManager.requestLocationUpdates();

    userInfo = complexPreferences.getObject("user_info", UserInfo.class);

    setLocale(userInfo.language);

public void setLocale(String lang) {
    Locale myLocale;
    myLocale = new Locale(lang);
    Resources res = context.getApplicationContext().getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
}

Удивительно, нокод на самом деле работает, снесколько исключений (не работает на телефоне Xiaomi, Android 8).Если вы выбрали румынский язык из счетчика языков при регистрации, приложение будет отображаться на румынском языке.Согласно множеству фрагментов кода, которые я нашел в StackOverflow, это не должно было работать.

Проблема в том, что я не могу гарантировать, что он будет работать на всех устройствах.Кроме того, не все строки работают (у меня все еще есть английский «Поиск» в поле вместо «Cauta» на румынском).

У вас есть какой-нибудь совет, как подойти к этому?Я пробовал все виды вещей, но ничего не получалось, включая блоки кода, специфичные для версии SDK и т. Д.)

Спасибо!

...