web-dev-qa-db-fra.com

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

<LinearLayout Android:id="@+id/svLL" Android:orientation="horizontal"
    Android:layout_width="fill_parent" Android:layout_height="fill_parent">
    <ScrollView Android:id="@+id/sv"
        Android:layout_width="wrap_content" Android:layout_height="wrap_content"
        xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <!--
            <TextView Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:text="@string/scrollbar_2_text" />
        -->
        <com.mypackage.MyDrawableView
            Android:layout_width="fill_parent" Android:layout_height="wrap_content" />
    </ScrollView>
</LinearLayout>

public class MyDrawableView extends View {

    Context thisContext;

    public MyDrawableView(Context context, AttributeSet 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?

39
mynameisanthpny

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

82

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

36
Romain Guy

Vous devez @Override la méthode 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 sur la taille width=0 height=0. Et par conséquent, n'essayez même pas d'appeler onDraw.

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

(Vous devez donc connaître la taille de l'écran Android avec la méthode OnMeasure et appeler setMeasuredDimension en conséquence).

15
Gust Jc

Il suffit de créer layout_width et layout_height de la vue personnalisée avec un correctif initial au lieu de wrap_content ou fill_parent. Cela a fonctionné pour moi.

3
virajdasondi

Après avoir défini la largeur de la 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(); 
0
John Great

Probablement

setMinimumHeight(width);
setMinimumWidth(height);

dans le constructeur ne sont pas définis ou onMeasure() n'est pas remplacé.

0
CoolMind

Voici une autre raison pour laquelle votre vue pourrait ne pas apparaître. Si vous créez votre ViewGroup personnalisé avec des sous-vues, n'oubliez pas d'ajouter les sous-vues à votre ViewGroup.

Dans votre appel de constructeur ViewGroup

addView(mySubView);

Pensez également à mesurer et à disposer vos vues secondaires dans onLayout().

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    mySubview.measure(...);
    mySubview.layout(...);
}
0
Suragch

Bien que je sois nouveau dans Android, je pense toujours que le problème vient de 

setContentView(R.layout.xmllayout); 

Au lieu de "R.layout.xmllayout", passez l'objet MyDrawableView (à l'aide de findViewById) et vérifiez ..__ Je n'ai pas essayé, mais j'espère que cela fonctionnera.

0
Biplab Kundu

Vous devez utiliser invalidate () dans la méthode constructeur pour obtenir l'appel appelé onDraw.

0
Muhammad Aamir Ali