Разработать приложение для Android для поддержки «выравнивания макета» на английском и арабском языках - PullRequest
13 голосов
/ 14 марта 2012

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 14 марта 2012

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

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

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

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

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

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

Locale.getDefault().getDisplayLanguage();

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

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

1 голос
/ 31 мая 2017

В Android 4.2 появилась встроенная поддержка right to left макета.

  • В AndroidManifest установите android:supportsRtl="true"
  • В свойствах макета используйте свойства start / end вместо влево / вправо .

Вот видео с подробным объяснением: https://youtu.be/plW1qSGDSzs

0 голосов
/ 28 мая 2013

Я пытался извлечь из этого ужас, создав набор пользовательских компонентов LabeledView (для таких компонентов формы, как CheckBox, EditText и Spinners). Эти представления (например, 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, а не на комбо TextView и EditText.

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

0 голосов
/ 14 марта 2012

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

...