Я пытался извлечь из этого ужас, создав набор пользовательских компонентов 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);
строка кода). В зависимости от того, насколько велико ваше приложение, вы можете попробовать что-то подобное?