Propre mise en page définie, la méthode onDraw () n'est pas appelée


90

J'ai défini une classe comme ça :

public class TestMyFrameLayout extends FrameLayout{

    Paint mPaint;
    public TestMyFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TestMyFrameLayout(Context context) {
        super(context);
        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(50f, 50f, 30, mPaint);
    }   
}

et l'a appelé comme:

TestMyFrameLayout myFrameLayout = new TestMyFrameLayout(this);
LayoutParams myFrameLayoutParams = new LayoutParams(300,300);
myFrameLayout.setLayoutParams(myFrameLayoutParams);
setContentView(myFrameLayout);

Mais en fait, la fonction TestMyFrameLayout.onDraw (Canvas canvas) n'est pas appelée, pourquoi?


Pourriez-vous montrer le code là où vous l'utilisez? Ajoutez également @Overrideavant onDraw: cela vérifiera la faute de frappe dans eclipse.
Laurent '16

3
Merci Laurent '. Mon problème est déjà résolu. Ajoutez this.setWillNotDraw (false);
old_hou

Réponses:


211

Résolu. Ajouter un this.setWillNotDraw(false); constructeur


24
Cela n'aurait pu être qu'un développeur angoissé qui l'a défini sur true par défaut!
Narcís Calvet

2
pourquoi cela aiderait-il?
RyanShao

5
@RyanShao pour ViewGroups est défini sur true par défaut.
ataulm

1
pourquoi diable quelqu'un voudra-t-il que ce soit vrai? Pourquoi??
Kai Wang

Je suppose que c'est une optimisation pour quand un ViewGroup est un conteneur pur avec rien à dessiner pour lui
hmac
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.