8

私はこのコードを持っています:

public class CopyOfLinearLayoutEntry extends LinearLayout implements Checkable {
    private CheckedTextView _checkbox;
    private Context c;

    public CopyOfLinearLayoutEntry(Context context) {
        super(context);
        this.c = context;
        setWillNotDraw(false);
    }

    public CopyOfLinearLayoutEntry(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.c = context;
        setWillNotDraw(false);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint strokePaint = new Paint();
        strokePaint.setARGB(200, 255, 230, 230);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(12);
        Rect r = canvas.getClipBounds();
        Rect outline = new Rect(1, 1, r.right - 1, r.bottom - 1);
        canvas.drawLine(r.left, r.top, r.right, r.top, strokePaint);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        // find checked text view
        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View v = getChildAt(i);
            if (v instanceof CheckedTextView) {
                _checkbox = (CheckedTextView) v;
            }
        }
    }

    @Override
    public boolean isChecked() {
        return _checkbox != null ? _checkbox.isChecked() : false;
    }

    @Override
    public void setChecked(boolean checked) {
        if (_checkbox != null) {
            _checkbox.setChecked(checked);
        }
    }

    @Override
    public void toggle() {
        if (_checkbox != null) {
            _checkbox.toggle();
        }
    }
}

今度は RelativeLayout のバージョンも必要なので、クラス ファイルを複製し、「extends LinearLayout」を「extends RelativeLayout」に置き換えます。重複したコードが欲しくないので、それは悪いと思います。

Java が多重継承を許可していないことを知って、どうすれば私の目標を達成できるでしょうか?

コンポジションデザインパターンについて読んだことがありますが、それを実装する方法がわかりません。

この問題を最もエレガントに解決する方法について、誰かが私に出発点を教えてくれるでしょうか?

4

3 に答える 3

1

コードの重複を避けるために、両方を拡張する必要はありません。次のようなことができます。

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckedTextView;

public class GenericLayout extends ViewGroup{

    private CheckedTextView _checkbox;

    public GenericLayout(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint strokePaint = new Paint();
        strokePaint.setARGB(200, 255, 230, 230);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(12);
        Rect r = canvas.getClipBounds();
        Rect outline = new Rect(1, 1, r.right - 1, r.bottom - 1);
        canvas.drawLine(r.left, r.top, r.right, r.top, strokePaint);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        // find checked text view
        int childCount = getChildCount();
        for (int i = 0; i < childCount; ++i) {
            View v = getChildAt(i);
            if (v instanceof CheckedTextView) {
                _checkbox = (CheckedTextView) v;
            }
        }
    }

    public boolean isChecked() {
        return _checkbox != null ? _checkbox.isChecked() : false;
    }

    public void setChecked(boolean checked) {
        if (_checkbox != null) {
            _checkbox.setChecked(checked);
        }
    }

    public void toggle() {
        if (_checkbox != null) {
            _checkbox.toggle();
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub

    }

}



public class Linear extends LinearLayout {

    GenericLayout generic;

    public Linear(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        generic = new GenericLayout(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        generic.onDraw(canvas);
    }

        ...

}

public class Relative extends RelativeLayout{

    GenericLayout generic;

    public Relative(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        generic.onDraw(canvas);
    }

        ...

}
于 2013-02-21T22:40:20.670 に答える
0

私が学んで使ってきたことには、次の 2 つの方法があります。

  1. 回避しようとしていることができます(クラスファイルを複製し、「extends LinearLayout」を「extends RelativeLayout」に置き換えます)

  2. 2 つのインターフェイスと 1 つのクラスを作成できます。1 つは LinearLayout を拡張するインターフェイス、もう 1 つは RelativeLayout を拡張するためのインターフェイス、および拡張インターフェイスのメソッドと変数を実装するクラスです。

それが少し役立つことを願っています

于 2013-02-11T08:56:10.853 に答える
0

アプローチを再考する必要があります。

レイアウトを使用して VIEW ロジックを制御しているようです。残念ながら、あなたの質問には、あなたが達成しようとしていることについての情報があまりありません。

いくつかの可能性があります:

  • カスタムロジックでLAYOUTプロキシ/デリゲートを実装します(悪いアプローチIMO)
  • VIEWオブジェクトを制御する専用のHANDLERクラスを作成します...これらはLAYOUTに依存しません
  • あなたのVIEWオブジェクトを作成し、LAYOUTの代わりにVIEWオブジェクトを使用してください(おそらく行く方法です)
于 2013-02-11T14:33:59.907 に答える