webentwicklung-frage-antwort-db.com.de

Die benutzerdefinierte onDraw () -Methode wird nicht aufgerufen

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

} 

Ich setze einen Haltepunkt, aber der Haltepunkt wird in der onDraw()-Methode niemals getroffen. Was ist los?

39
mynameisanthpny

Fügen Sie setWillNotDraw(false) im MyDrawableView-Konstruktor hinzu. Ursprüngliche Antwort ist hier .

82

Ihre Ansicht hat eine Höhe von 0. Sie haben Ihre Ansicht so festgelegt, dass sie height=wrap_content hat. Sie überschreiben jedoch nicht onMeasure(), um dem UI-Toolkit mitzuteilen, wie groß Ihre Ansicht ist.

36
Romain Guy

Sie müssen @Override die OnMeasure(int, int)-Methode angeben, um die Größe Ihrer Ansicht anzugeben, indem Sie setMeasuredDimension(int,int) aufrufen.

Wenn Sie dies nicht tun, wird die Ansicht mit der Standardmethode auf die Größe width=0 height=0 festgelegt. Versuchen Sie deshalb nicht einmal, onDraw aufzurufen.

Die OnMeasure-Methode ruft setMeasuredDimension(int,int) auf, die angibt, wie groß Ihre Ansicht ist.

(Sie müssen also die Größe des Android-Bildschirms für die Methode OnMeasure ermitteln und entsprechend setMeasuredDimension aufrufen).

15
Gust Jc

Nehmen Sie einfach layout_width und layout_height der benutzerdefinierten Ansicht zu Beginn einen Fix vor, statt wrap_content oder fill_parent____.

3
virajdasondi

Nachdem Sie die Breite der benutzerdefinierten Ansicht festgelegt haben, sollten Sie die Bildlaufbreite festlegen.

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

Wahrscheinlich

setMinimumHeight(width);
setMinimumWidth(height);

im Konstruktor nicht gesetzt oder onMeasure() wird nicht überschrieben.

0
CoolMind

Dies ist ein weiterer Grund, warum Ihre Ansicht möglicherweise nicht angezeigt wird. Wenn Sie eine benutzerdefinierte Ansichtsgruppe mit Unteransichten erstellen, müssen Sie daran denken, die Teilansichten Ihrer Ansichtsgruppe hinzuzufügen.

In Ihrem ViewGroup-Konstruktor-Aufruf

addView(mySubView);

Denken Sie auch daran, Ihre Unteransichten in onLayout() zu messen und zu gestalten.

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

Obwohl ich neu in Android bin, glaube ich immer noch, dass das Problem daran liegt 

setContentView(R.layout.xmllayout); 

Anstelle von "R.layout.xmllayout" übergeben Sie MyDrawableView object (mit findViewById) und prüfen Sie .

0
Biplab Kundu

Sie müssen invalidate () in der Konstruktormethode verwenden, um den Aufruf von onDraw zu erhalten.

0