我正在开发一款支持En / Ar的Android应用。但我遇到的问题是,如果用户从En更改为Ar,则用户界面的对齐必须从“从左到右”变为“从右到左”。
示例:(TextView)(EditText)这是在En
中但在Ar中它应该是:(EditText)(TextView)。
有没有办法做到这一点而不创建两个不同的布局或两个不同的版本?
答案 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
组件来解决这个问题(对于CheckBox
,EditText
和{{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);
}
视图而不是LabeledEditText
和TextView
组合。
在我没有完全展示的实现中,我更进了一步,创建了一个抽象的EditText
类,它使用了一些自定义属性,允许我在特定情况下自定义标签和值(请参阅LabeledView
代码行。根据您的应用程序的大小,您可能想尝试类似的东西吗?
答案 3 :(得分:-3)
为什么不将TextView设置在EditText上面?