Я работаю над настройкой языка в моем приложении. Я смог изменить локаль из своего основного вида деятельности с помощью

Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
configuration.setLocale(new Locale("ar"));
resources.updateConfiguration(configuration,displayMetrics);
recreate();

Все работало нормально, но я заметил, что кнопка возврата не изменила своего направления на RTL:

enter image description here

Это мое ожидаемое поведение, когда я устанавливаю язык RTL:

enter image description here

Возможно ли это?

4
user1506104 3 Мар 2018 в 10:19

3 ответа

Лучший ответ

Изменение направления навигационной панели означает, что приложение изменит Locale устройства. Это похоже на установку языка устройства в языковой настройке устройства, поскольку Locale определяет язык и направление (rtl или ltr) представлений для поддержки языка. Поскольку вы изменяете только Locale своего Context в приложении, это не повлияет на Context других приложений на устройстве и в системе. приложения / компоненты (панель запуска, панель навигации, строка состояния и т. д.). Следовательно, панель навигации не изменится и останется незатронутой изменением в вашем приложении.

Кроме того, чтобы изменить устройство Locale или любую другую конфигурацию (шрифт, размер шрифта, метрики отображения, вращение и т. Д.), Приложению для этого потребуется разрешение SET_CONFIGURATION. Хотя это не указано в документах, {{ X2}} разрешение может быть дано автоматически только системным приложениям, таким как язык и настройки дисплея. Я не видел, может ли он быть запрошен у пользователя сторонним приложением, но я полагаю, что в большинстве случаев при разработке моих приложений этого не может быть, разрешение было предоставлено с помощью команды adb shell pm grant в командная строка. Обычно я делаю это во время моих тестов, так как мои приложения также поддерживают другие языки и хотят убедиться, что приложение хорошо работает в таких случаях, поэтому я бы предоставил ему разрешение в командной строке и позволил бы изменить языковой стандарт устройство изнутри испытаний.

1
ahasbini 10 Мар 2018 в 23:23

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

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void forceRTLIfSupported()
{
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){

      //HERE CHECK CONDITION FOR YOUR LANGUAGE if it is AR then
      //change if it is english then don't

      getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);


    }
}
1
Sagar Gadani 8 Мар 2018 в 05:37

Направление навигационной панели (и других частей ОС, таких как Настройки), не связано с приложением. Пользователь может иметь ОС LTR с приложением RTL. Таким образом, изменение языкового стандарта и направления вашего приложения не влияет на базовую ОС, и пользователь должен изменить это вручную.

0
Adib Faramarzi 11 Мар 2018 в 13:57