private class HSV extends HorizontalScrollView {
public LinearLayout L;
public AbsoluteLayout A;
public HSV(Context context) {
super(context);
L = new LinearLayout(context);
A = new AbsoluteLayout(context);
}
@Override public void addView(View child) {
A.addView(child);
}
void update_scroll() {
removeView(L);
addView(L, 0);
L.removeView(A);
L.addView(A);
A.invalidate();
L.invalidate();
invalidate();
requestLayout();
}
int GetCurrentPos() {
return getScrollX(); // <-- this line if HSV
return getScrollY(); // <-- this line if VSV
}
... few more methods skipped, they will not change at all in 'vertical' version
}
Ho questa classe, fa perfettamente quello che voglio. Ora ho bisogno di un nuovo VSV di classe che deriverà da ScrollView (verticale) e sarà lo stesso. Sono certamente posso solo copiare intero blocco e cambiarne estende HorizontalScrolView a estende ScrollView, e quindi (L, 0) a (0, L) (oops, questo è stato un errore durante la pubblicazione su SO, sicuramente quello la linea non cambierà, il GetCurrentPos lo farà).java sugaring, posso evitare il codice quasi duplicato qui?
oppure posso aggiungere la proprietà "bool vertical". Ma Java non ha modelli o macro, né prototipi di runtime, quindi c'è un altro modo in Java per evitare la duplicazione del codice in questo esempio?
Avere una classe base comune e derivare una classe verticale e una classe orizzontale. O con l'orientamento del parametro costruttore (à la swing) o sovrascritto. –
Se si ottiene la classe VSV da HSV. Puoi semplicemente sovrascrivere il metodo addView con un metodo vuoto. Forse dovresti estrarlo prima con un altro metodo e poi sostituirlo. –
Sarei rimasto con quelle due classi. Renderà il tuo codice più complicato e più difficile da eseguire il debug nel tentativo di unirli. E il tempo di pensare a questo non vale le poche righe di codice che stai salvando. – Kai