Pourquoi onDraw n'est pas appelé après invalidate()?
J'ai trouvé de nombreux messages sur stackoverflow mais je n'arrive toujours pas à résoudre mon problème. Voici mon code pièce:
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;
}
}
Pourriez-vous nous expliquer pourquoi onDraw n'est pas la première trois fois, je presse b1? Parce que j'ai appelé invalider chaque fois que j'appuie sur b1. Merci beaucoup!
- stackoverflow.com/questions/17576970/.... vérifier cela peut aider
Vous devez vous connecter pour publier un commentaire.
Par défaut, tous les ViewGroup sous-classes ne pas appeler leurs
onDraw
méthode, vous devez l'activer en appelantsetWillNotDraw(false)
lienD'emprunt à partir du lien @
Android Mise en page Personnalisée - onDraw() n'est jamais appelée
Essayer de le ci-dessous il fonctionne
1.Si vous êtes à l'extension d'un ViewGroup (dans votre cas, un
RelativeLayout
) vous devez remplacerdispatchDraw()
au lieu deonDraw()
.De Discussion sur le sujet @
https://groups.google.com/forum/?fromgroups=#!topic/android-développeurs/oLccWfszuUo
protected void dispatchDraw (Canvas canvas)
Appelé par tirage au sort pour dessiner les vues enfant. Cela peut être remplacée par les classes dérivées de prendre le contrôle juste avant que ses enfants sont tirées (mais après son propre point de vue a été tiré).
Paramètres
toile la toile sur laquelle dessiner la vue
Exemple
2.Si vous remplacez
onDraw
dans l'appel du constructeursetWillNotDraw(false)
alors il devrait fonctionner.http://developer.android.com/reference/android/view/View.html#setWillNotDraw(booléen)
Vous devez appeler
setWillNotDraw(false);
pour que votre méthode onDraw d'être appelé:J'ai eu OnDraw pas appelé en C# à l'aide de 4.1 Jelly Bean API 16. Je suis passé à partir de la compilation avec l'API 16 kit de développement pour la compilation avec 7.1 Nougat SDK. Il a résolu complètement le problème. J'ai encore dans le manifeste min sdk API 16 et il fonctionne très bien dans mon Gelée Faisceau avd.