Направление компоновки Force RTL не работает для приложения
Я пытаюсь добавить поддержку языка RTL в мое приложение (в частности, арабский прямо сейчас). Я также буду поддерживать английский. Что я сделал:
- установить minSdkVersion в 17
- добавил
android:supportsRtl="true"
к моему тегу приложения вAndroidManifest.xml
- переключил мои левые / правые атрибуты на start / end
сначала я сделал эти изменения вручную, затем я использовал "рефакторинг" Android Studio -> добавить поддержку RTL, где это возможно..." меню пункт.
когда я просматриваю свои файлы макета, я вижу, что предварительный просмотр RTL правильно отражает пользовательский интерфейс; однако, даже когда я использую "направление компоновки Force RTL", мое приложение не отображает макет RTL. Пользовательский интерфейс системы перевернут, так что этот параметр работает в целом.
есть ли что-нибудь еще, что мне нужно сделать, чтобы показать макет RTL? Надеюсь, я упустил что-то очевидное. Я тестирую это на эмуляторе API 21.
обновление
я унаследовал некоторые настоящий кодекс. Что-то может переопределить настройку и принудительно перевести ее в режим LTR. Я сделал тестовое приложение для тестирования режима RTL, и он работал нормально. Какой код может вызвать игнорирование (или переопределение) параметра "Force RTL Layout Direction"?
обновление 2
Я проверил, что локаль устанавливается правильно, и это так. Я также проверил конфигурацию, и ldrtl
установлен. Я проверил в подписанном файле apk, что android:supportsRtl
сделал это, и ни один из файлы макета имели android:layoutDirection="ltr"
. Я даже пытался вручную положить android:layoutDirection="rtl"
чтобы попытаться заставить макет отражать, но это тоже не сработало.`
обновление 3
я добавил еще одно действие в проект, сделал его активностью запуска и убедился, что он не подключен к существующему коду. Это подкласс Activity
. Проблема все еще существует. Так что теоретически это проблема конфигурации. Как я уже сказал, Я проверил AndroidManifest.XML-файл и все файлы макета, которые генерируется, и поддержка RTL и изменения макета все сделали это. Что может быть не так с конфигурацией?
2 ответов
самый неясный ошибка когда-либо. Как я уже упоминал в вопросе, большая часть этого кода была унаследована. Это закончилось тем, что побитовая проблема оператора, которая завинчивала флаги для приложения. &=
используется вместо &
чтобы проверить, установлен ли флаг.
как отмечено в комментарии, код был взят из примера в Android разработчики блог сообщение, что объясняет, почему так много других столкнулись с этой же проблемой. Я подал сообщение об ошибке и сообщение в блоге с тех пор молча обновляется. Вот исходный код, который я удалил &=
from. не используйте следующий код как есть. Вам нужно изменить &=
to &
:
isDebuggable = (appContext.getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0;
попробуйте это...
-
создать класс для поддержания глобального состояния приложения.
public class YourGlobalClass extends Application { @Override public void onCreate() { updateLanguage(this, null); super.onCreate(); } public static void updateLanguage(Context ctx, String lang) { Configuration cfg = new Configuration(); LocalSharedManager manager = new LocalSharedManager(ctx); String language = manager.GetValueFromSharedPrefs("force_locale"); if (TextUtils.isEmpty(language) && lang == null) { cfg.locale = Locale.getDefault(); String tmp_locale = ""; tmp_locale = Locale.getDefault().toString().substring(0, 2); manager.SaveValueToSharedPrefs("force_locale", tmp_locale); } else if (lang != null) { cfg.locale = new Locale(lang); manager.SaveValueToSharedPrefs("force_locale", lang); } else if (!TextUtils.isEmpty(language)) { cfg.locale = new Locale(language); } ctx.getResources().updateConfiguration(cfg, null); } }
указать глобальный класс AndroidManifest.в XMLтег, который приведет к тому, что этот класс будет создан с сохраненным языковым стандартом, когда будет создан процесс для вашего приложения/пакета. Как,
android:name="com.your.package.YourGlobalClass" android:supportsRtl="true"
-
создайте следующие два метода в MainActivity.Ява (где вы хотеть.)
public class MainActivity extends ActionBarActivity{ ....... // Implement OnclickListener for english_locale button findViewById(R.id.english_locale).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeEnglish(); } }); // Implement OnclickListener for arabic_locale button findViewById(R.id.arabic_locale).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { changeArabic(); } }); /** * Method that Update UI for Arabic locale. */ public void changeArabic() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { String app_locale = "ar"; Locale locale = new Locale(app_locale); Locale.setDefault(locale); //Configuration to query the current layout direction. Configuration config = new Configuration(); config.locale = locale; getResources().updateConfiguration(config, getResources().getDisplayMetrics()); Bidi bidi = new Bidi(app_locale, Bidi.DIRECTION_DEFAULT_RIGHT_TO_LEFT); bidi.isRightToLeft(); YourGlobalClass.updateLanguage(getActivity(), "ar"); //Refreshing current fragment Intent i = getActivity().getIntent(); startActivity(i); getActivity().finish(); return null; } }.execute(); } /** * Method that Update UI for Default(English) locale. */ public void changeEnglish() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { String app_locale = "en"; Locale locale = new Locale(app_locale); Locale.setDefault(locale); //Configuration to query the current layout direction. Configuration config = new Configuration(); config.locale = locale; getResources().updateConfiguration(config, getResources().getDisplayMetrics()); Bidi bidi = new Bidi(app_locale, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT); bidi.isLeftToRight(); YourGlobalClass.updateLanguage(getActivity(), "en"); //Refreshing current fragment Intent i = getActivity().getIntent(); startActivity(i); getActivity().finish(); return null; } }.execute(); } ...... //MainActivity end }
удачи в кодировании...