独自に定義したLayout、onDraw()メソッドが呼び出されない


90

私はそのようなクラスを定義しました:

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

そしてそれを次のように呼びました:

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

しかし、実際にはTestMyFrameLayout.onDraw(Canvas canvas)関数が呼び出されないのはなぜですか?


それを利用する場所でコードを見せていただけませんか?また、@OverrideonDrawの前に追加します。これにより、Eclipseのタイプミスがチェックされます。
ローラン

3
ローランありがとうございます。私の問題はすでに解決されています。this.setWillNotDraw(false);を追加します。
old_hou

回答:


211

解決しました。this.setWillNotDraw(false); コンストラクタに追加


24
デフォルトでtrueに設定したのは、不安を抱えた開発者だけでした。
ナルシスカルベ

2
なぜこれが役立つのですか?
RyanShao

5
ViewGroupsの@RyanShaoは、デフォルトでtrueに設定されています。
ataulm

1
なぜ誰かはそれが真実であることを望みますか?なぜ??
Kai Wang

それは、ViewGroupが何も描画しない純粋なコンテナである場合の最適化だと思います
hmac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.