Intereting Posts
Переход Android не работает на телефоне Неверные теги формата HTML в диалоге Ресурс Theme.AppCompat.Light не найден в Android Studio Ошибка: невозможно найти adb в SDK в Android Studio Найти имя пакета для приложений Android, чтобы использовать Intent для запуска приложения Market из Интернета Несколько ключей и значений JSONObject не сохраняются в Parse Отладчик Eclipse останавливается сам по себе без каких-либо бросков SQLiteAssetHelper: не удалось открыть базу данных для записи (попробуйте только чтение) GridLayout выталкивает своих детей и переполняет, когда задано fill_parent для высоты Как исправить «Избегайте передачи null в качестве корня представления» в android? Android эквивалент setTimeout и clearTimeout javascript? Как получить доступ к файлу в папке с ресурсами? Android ADB не может запускаться на ubuntu 14.04 LTS или не может запускать AVD в эмуляторе Как получить возможную продолжительность простоя телефона на основе текущего уровня заряда аккумулятора Различные ориентации экрана

Разработайте приложение 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?