Intereting Posts
Как скрыть / показать скрытые компоненты в элементах списка при прокрутке в android? Службы Android Play FusedLocatioAPI getLastLocation аварийно завершает работу с SecurityException Как я могу узнать, какое намерение запускается сервис (а не в моем приложении)? IntelliJ IDEA 12 и Homebrew Android SDK Служба на переднем плане убита на Huawei (GRA-UL00) – Защищенные приложения включены Canvas – масштабирование, изменение и масштабирование на Android Как заставить фокус редактировать текст Не удалось открыть связанное приложение с (профилем компании) url другим приложением для Android? Повернуть рамку, содержащую динамические кнопки Соглашение о пакете Java Как отключить и включить прокрутку на экране прокрутки Android? Текст Android CheckBox не отображается Как получить экземпляр локальной сети Android Добавление участников в чаты XMPP Что случилось с удалением элементов из realm.io? RealmException «Удаление объекта не поддерживается».?

Разработайте приложение Android для поддержки английского и арабского «выравнивания компоновки»,

Я разрабатываю приложение для Android для поддержки En / Ar. Но я столкнулся с проблемой, что, если пользователь изменится с En на Ar, выравнивание пользовательского интерфейса должно перейти от «слева направо» на «справа налево».

Пример: (TextView) (EditText) это в En

Но в Ar это должно быть: (EditText) (TextView) .

Есть ли способ сделать это без создания двух разных макетов или двух разных версий?

Почему это невозможно сделать с двумя макетами (вы никогда не говорили, почему это нежелательно)? Как описано в документации разработчиков Android

Большая часть локализации приложения предоставляет альтернативный текст для разных языков. В некоторых случаях вы также будете предоставлять альтернативную графику, звуки, макеты и другие локальные ресурсы.

Приложение может указывать много каталогов res //, каждый из которых имеет разные квалификаторы. Чтобы создать альтернативный ресурс для другого языкового стандарта, вы используете классификатор, который указывает язык или комбинацию языковых областей.

Ссылка: http://developer.android.com/guide/topics/resources/localization.html

Поэтому в вашем случае создайте res/layout-ar затем скопируйте существующий макет в эту папку, а затем просто поменяйте их. Простой, следует передовой практике и легко сделать. Это также облегчает дальнейшие изменения локализации без необходимости писать больше кода.

Если вам нужно написать код, вам понадобится найти язык по умолчанию устройства, а затем поменять его на основе этого. Вы можете получить язык:

 Locale.getDefault().getDisplayLanguage(); 

См. Этот вопрос для получения дополнительной информации: Получить текущий язык в устройстве

В заключительном личном примечании: я думаю, что первое – это гораздо лучшее разделение проблем, поскольку код обеспечивает логику, а макеты XML фактически управляют макетом (при этом Android автоматически выбирает правильные ресурсы для вас без необходимости писать больше кода).

Я попытался извлечь из этого ужас, создав набор пользовательских компонентов LabeledView (для компонентов Form, таких как CheckBox , EditText и Spinners ). Эти представления (например, LabledEditText ) LabledEditText специфичный для региона макет и реализуют минимальное количество вызовов, чтобы действовать как фасад (в этом случае EditText ).

 res/layout/component_labeled_view.xml - [TextView][EditText] res/layout-ar/component_labeled_view.xml - [EditText][TextView] 

Сам класс View содержит:

 public LabeledEditText(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflator = LayoutInflater.from(context); mContainer = inflator.inflate(R.layout.component_labeled_edittext, null); mValueView = (EditText) mContainer.findViewById(R.id.editText); mLabelTextView = (TextView) mContainer.findViewById(R.id.textView); align(attrs); } public Editable getText() { return ((EditText)mValueView).getText(); } public void setText(String text) { ((EditText)mValueView).setText(text); } public void addTextChangedListener(TextWatcher watcher) { ((EditText)mValueView).addTextChangedListener(watcher); } 

Это должно по крайней мере сократить любое дублирование, так как теперь вы можете ссылаться на представление LabeledEditText а не на LabeledEditText TextView и EditText .

В моей реализации, которую я не полностью показал, я сделал еще один шаг и создал абстрактный класс LabeledView который использует некоторые настраиваемые атрибуты, позволяющие мне настраивать как метку, так и значение в определенных ситуациях (см. align(attrs); ). В зависимости от того, насколько велико ваше приложение, вы можете попробовать что-то подобное?

Android 4.2 представила встроенную поддержку макета «справа налево». В AndroidManifest установлен андроид: supportsRtl = "true" на уровне приложения, а в свойствах макета вместо начальных / конечных свойств используются свойства start / end, а не left / right. Вот видео с подробным объяснением: https://youtu.be/plW1qSGDSzs

Почему бы просто не сделать TextView над EditText?