¿Por qué onDraw no se llama después de invalidate ()?

He encontrado muchos postes en stackoverflow pero todavía no puedo solucionar mi problema. Aquí está mi pieza de código:

public class MyView extends RelativeLayout { Button b1; Button b2; Context sContext; public static int i = 0; private int w = 400; private int h = 400; private int w2 = 100; private int h2 = 100; public MyView(Context context) { super(context); sContext = context; init(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); sContext = context; init(); } private void init() { b1 = new Button(sContext); addView(b1); b1.setBackgroundColor(Color.YELLOW); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (w >= 600) { MyView.this.setBackgroundColor(Color.GREEN); //b1.setBackgroundColor(Color.RED); } else { MyView.this.setX(100); } MyView.this.invalidate(); w += 100; w2 += 20; } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //b1.setBackgroundColor(Color.RED); Toast.makeText(sContext, ""+i, Toast.LENGTH_SHORT).show(); ++i; } } 

¿Podría explicar por qué onDraw no se llama las tres primeras veces que pulse b1? Porque llamé invalidate cada vez que presiono b1. ¡Muchas gracias!

Por defecto todas las subclases de ViewGroup no llaman a su método onDraw , deberías habilitarlo llamando a setWillNotDraw(false) link

Tomar prestado del enlace @

Disposición personalizada de Android – onDraw () nunca se llama

Prueba lo siguiente

1.Si está extendiendo un ViewGroup (en su caso un RelativeLayout ) debe reemplazar dispatchDraw() lugar de onDraw() .

Discusión sobre el tema @

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/oLccWfszuUo

protected void dispatchDraw (Canvas canvas)

Llamado por sorteo para dibujar las vistas de los niños. Esto puede ser anulado por las clases derivadas para ganar el control justo antes de que sus hijos sean dibujados (pero después de que su propia opinión haya sido dibujada) .

Parámetros

Lienzo el lienzo sobre el que dibujar la vista

Ejemplo

 public class Hello extends Activity { private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); Log.e("hello", "hello"); this.myView = new MyView(this); setContentView(this.myView); } public class MyView extends RelativeLayout { private Paint myPaint = new Paint(); private int[] numbers; public MyView(Context paramContext) { super(paramContext); Log.e("MyView", "MyView"); setFocusable(true); setBackgroundResource(R.drawable.ic_launcher); } @Override protected void dispatchDraw(Canvas canvas){ super.dispatchDraw(canvas); Log.i("...............","drawing"); } } } 

2. Si onDraw en la llamada del constructor setWillNotDraw(false) entonces debería funcionar.

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

 public MyView(Context context) { super(context); sContext = context; init(); setWillNotDraw(false); } 

Necesita llamar a setWillNotDraw(false); Para que su método onDraw sea llamado:

 private void init() { setWillNotDraw(false); ... } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.