8
votes

Android: prolonger la linearlayout, mais avoir besoin de la même chose pour relativenifayouout. Code dupliquer inévitable?

J'ai ce code:

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();
        }
    }
}


0 commentaires

3 Réponses :


0
votes

de ce que j'ai appris et utilise, il y a deux manières:

  1. Vous pouvez faire ce que vous essayez d'éviter (dupliquer le fichier de classe et de remplacer "étend linéarlayout" avec "étend le relativation")

  2. Vous pouvez créer 2 interfaces et 1 classe: une interface qui s'étend sur la linearlayout, une autre pour étendre la relativation et la classe mettant en œuvre les procédés et les variables des interfaces étendues.

    J'espère que cela aide un peu


0 commentaires

0
votes

Vous devez repenser votre approche.

semble que vous utilisiez la mise en page pour contrôler la logique de vue. Malheureusement, votre question n'a pas trop d'informations sur ce que vous essayez d'atteindre.

Vous avez peu de possibilités:

  • Mettre en œuvre la présentation proxy / délégué avec la logique personnalisée (mauvaise approche imo)
  • Faites une classe de gestionnaire dédiée pour contrôler vos objets d'affichage ... ceux-ci seront indépendants sur la mise en page
  • Faites votre objet d'affichage et utilisez l'objet View au lieu d'une mise en page (probablement la voie à suivre)

0 commentaires

1
votes

Vous n'avez pas besoin de prolonger les deux pour éviter le code dupliqué. Vous pouvez faire quelque chose comme ceci: xxx


0 commentaires