Własny zdefiniowany układ, metoda onDraw () nie jest wywoływana


90

Zdefiniowałem taką klasę :

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

i nazwał to tak:

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

Ale w rzeczywistości funkcja TestMyFrameLayout.onDraw (Canvas) nie jest wywoływana, dlaczego?


Czy możesz pokazać kod, w którym go wykorzystujesz? Dodaj także @Overrideprzed onDraw: to sprawdzi literówkę w zaćmieniu.
Laurent '16

3
Dziękuję Laurent ”. Mój problem został już rozwiązany. Dodaj this.setWillNotDraw (false);
old_hou,

Odpowiedzi:


213

Rozwiązany. Dodaj this.setWillNotDraw(false); w konstruktorze


24
To mógł być tylko zdenerwowany programista, który domyślnie ustawił to na true!
Narcís Calvet

2
dlaczego miałoby to pomóc?
RyanShao

5
@RyanShao dla ViewGroups jest domyślnie ustawione na true.
ataulm

1
dlaczego, do diabła, ktoś chce, żeby to była prawda? czemu??
Kai Wang

Myślę, że jest to optymalizacja pod kątem sytuacji, gdy ViewGroup jest czystym kontenerem i nie ma nic do narysowania
hmac
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.