Méthode onDraw () personnalisée non appelée

  <!--  -->    

 public class MyDrawableView extends View { Context thisContext; public MyDrawableView(Context context, AtsortingbuteSet attr) { super(context); thisContext = context; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); final Paint paint = new Paint(); paint.setColor(Color.BLUE); paint.setTextSize(12); canvas.drawText("Blah blah", 0, 100, paint); } } 

 public class MyActivity extends Activity { // Your member variable declaration here // Called when the activity is first created. @Override public void onCreate(Bundle savedInstanceState) { // Your code here super.onCreate(savedInstanceState); setContentView(R.layout.xmllayout); LinearLayout svll = (LinearLayout) findViewById(R.id.svLL); svll.setLayoutParams(new LinearLayout.LayoutParams(300, 300)); } } 

Je mets un point d’arrêt, mais le point d’arrêt n’est jamais touché dans la méthode onDraw() , qu’est-ce qui ne va pas?

Ajoutez setWillNotDraw(false) dans le constructeur MyDrawableView. La réponse originale est ici .

Votre vue a une hauteur de 0. Vous définissez votre View sur height=wrap_content , mais vous ne remplacez pas onMeasure() pour indiquer la taille de votre View à la boîte à outils de l’interface utilisateur.

Vous devez @Override la OnMeasure(int, int) pour spécifier la taille de votre vue en appelant setMeasuredDimension(int,int) .

Si vous ne le faites pas, la méthode par défaut définira votre vue pour avoir la width=0 height=0 . Et donc n’essayez même pas d’appeler onDraw du tout.

La méthode OnMeasure appelle setMeasuredDimension(int,int) qui indique la taille de votre vue.

(Vous devez donc obtenir la taille de l’écran Android sur la méthode OnMeasure et appeler setMeasuredDimension conséquence).

Il suffit de faire en layout_width que layout_width et layout_height de la vue personnalisée fixent un correctif au moment initial au lieu de wrap_content ou fill_parent . Cela a fonctionné pour moi.

Bien que je sois nouveau dans Android, je crois toujours que le problème est dû à

 setContentView(R.layout.xmllayout); 

Au lieu de "R.layout.xmllayout" , passez l’object MyDrawableView (en utilisant findViewById ) et vérifiez. Je n’ai pas essayé, mais j’espère que ça va marcher.

Vous devez utiliser la méthode du constructeur invalide () pour obtenir l’appel appelé onDraw.

Après avoir défini la largeur de vue personnalisée, vous devez définir la largeur de défilement.

 FMChart = (HKFMDrawChart)findViewById(R.id.fm_chart); FMChart.setWidth(xxxx); float scrollViewWidth = FMChart.getScrellViewWidth(); FMChart.setLayoutParams(new LinearLayout.LayoutParams( (int) (scrollViewWidth + HKApplication.getScreenWidth() / 2), LinearLayout.LayoutParams.WRAP_CONTENT)); FMChart.postInvalidate(); // onDraw(); 

Probablement

 setMinimumHeight(width); setMinimumWidth(height); 

in constructeur ne sont pas définis ou onMeasure() n’est pas onMeasure() .