Ho cercato di prendere un po 'l'orrore di questo con la creazione di un set di costume LabeledView
componenti (per i componenti Form come CheckBox
, EditText
e Spinners
). Queste viste (come LabledEditText
) gonfiano un layout specifico della regione e implementano il minimo delle chiamate per poter agire come facciata (EditText
in questo caso).
res/layout/component_labeled_view.xml - [TextView][EditText]
res/layout-ar/component_labeled_view.xml - [EditText][TextView]
La classe View
stesso contiene:
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);
}
Questo dovrebbe almeno ridurre duplicazioni, come si dovrebbe ora essere in grado di fare riferimento la vista LabeledEditText
piuttosto che un combo TextView
e EditText
.
Nella mia implementazione che non ho pienamente dimostrato che ho fatto un passo ulteriore e ha creato un abstract LabeledView
classe che utilizza alcuni attributi personalizzati che mi permette di personalizzare sia l'etichetta e il valore in situazioni specifiche (vedere la linea di align(attrs);
codice). A seconda di quanto è grande la tua app, potresti voler provare qualcosa di simile?
Non dimenticare di fare clic sul segno di spunta accanto alla soluzione che accetti come risposta alla tua domanda. –