开发Android应用程序以支持英语和阿拉伯语“布局对齐”

时间:2012-03-13 20:22:48

标签: android layout right-to-left

我正在开发一款支持En / Ar的Android应用。但我遇到的问题是,如果用户从En更改为Ar,则用户界面的对齐必须从“从左到右”变为“从右到左”。

示例:(TextView)(EditText)这是在En

但在Ar中它应该是:(EditText)(TextView)

有没有办法做到这一点而不创建两个不同的布局或两个不同的版本?

4 个答案:

答案 0 :(得分:12)

为什么不能用两种布局来完成(你从未说过为什么这不是很理想)?如Android开发者文档所述

  

本地化应用程序的很大一部分是提供替代方案   不同语言的文本。在某些情况下,您还将提供   替代图形,声音,布局和其他特定于语言环境的   资源。

     

应用程序可以指定许多res //目录   有不同的限定词。为a创建替代资源   在不同的语言环境中,您使用指定语言的限定符或   语言区域组合。

参考:http://developer.android.com/guide/topics/resources/localization.html

因此,在您的情况下,创建res/layout-ar然后将现有布局复制到此文件夹中,然后简单地将它们交换。简单,遵循最佳实践并且易于操作。这也使得任何进一步的本地化更改都变得更容易,而无需编写更多代码。

如果您要编写代码,则需要找到设备的默认语言,然后根据此交换视图。你可以通过以下方式获得语言:

Locale.getDefault().getDisplayLanguage();

有关详细信息,请参阅此问题:Get the current language in device

最后一个注意事项:我认为前者是一个更好的关注点分离,因为代码提供了逻辑,XML布局实际上控制了布局(Android为您自动选择合适的资源而无需再写码)。

答案 1 :(得分:1)

Android 4.2引入了对right to left布局的原生支持。

  • AndroidManifest设置android:supportsRtl="true"
  • 在布局属性中,使用 开始/结束 属性,而不是 左/右

以下是详细解释的视频:https://youtu.be/plW1qSGDSzs

答案 2 :(得分:0)

我试图通过创建一组自定义LabeledView组件来解决这个问题(对于CheckBoxEditText和{{1}等表单组件})。这些视图(例如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); } 视图而不是LabeledEditTextTextView组合。

在我没有完全展示的实现中,我更进了一步,创建了一个抽象的EditText类,它使用了一些自定义属性,允许我在特定情况下自定义标签和值(请参阅LabeledView代码行。根据您的应用程序的大小,您可能想尝试类似的东西吗?

答案 3 :(得分:-3)

为什么不将TextView设置在EditText上面?