5
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
}

私はこのクラスを持っています。それは私が望むことを完全に行います。ここで、(vertical)ScrollView から派生し、まったく同じになる新しいクラス VSV が必要です。私は確かにブロック全体をコピーして、 extends Horizo​​ntalScrollViewをextends ScrollViewに変更し、次に(L, 0)(0, L)に変更することができます (おっと、これは SO で公開するときの間違いでした。確かにその行は変更されず、GetCurrentPos は)。

または、「bool vertical」プロパティを追加できます。しかし、Java にはテンプレートやマクロ、ランタイム プロトタイピングがありません。Java でこの例のコードの重複を避ける方法は他にあるのでしょうか?

4

1 に答える 1

2

android.widget.ScrollViewandroid.widget.Horizo​​ntalScrollViewのドキュメントを見ると、どちらも実装しているようです

void addView(View child, int index)

したがって、ここで何も欠落していなければ、そのコード行を変更する必要はありません。また、どちらのクラスもandroid.view.ViewGroupからこのメソッドを継承しています。したがって、両方のクラスの実装が同じである場合、次のようなことができます

public abstract class ScrollViewDelegate<T extends FrameLayout> {
  private final T view;
  private LinearLayout L;
  private AbsoluteLayout A;

  public ScrollViewWrapper(T view) {
    this.view = view;
    L = new LinearLayout(view.getContext());   // or pass as parameter
    A = new AbsoluteLayout(view.getContext()); // or pass as parameter
  }

  void update_scroll() {
      view.removeView(L);
      view.addView(L, 0);
      L.removeView(A);
      L.addView(A);
      A.invalidate();
      L.invalidate();
      view.invalidate();
      view.requestLayout();
  }
  // ...
}

HSV/VSV では、このクラスに委任できます (必要な場合)。

public class HSV extends HorizontalScrollView {

  private final ScrollViewDelegate<HorizontalScrollView> delegate;

  public HSV(Context context) {
      super(context);
      this.delegate = new ScrollViewDelegate<HorizontalScrollView>(this);
  }
  // do stuff with this.delegate
}

public class VSV extends ScrollView {

  private final ScrollViewDelegate<ScrollView> delegate;

  public VSV(Context context) {
      super(context);
      this.delegate = new ScrollViewDelegate<ScrollView>(this);
  }
}
于 2013-03-05T12:19:26.123 に答える