2016-05-14 18 views
0

Bildschirm ist weiß & die System.out.println() innerhalb von OnDraw nie aufgerufen.Benutzerdefinierte Ansicht Klasse 'onDraw wird nicht von Invalidate aufgerufen

Das ist mein activity_main.xml

<foo.packagename.MyView 
    android:id="@+id/myView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

Die benutzerdefinierte Ansicht Klasse:

public class MyView extends View { 

public MyView(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 

    System.out.println("This line is called"); 

    while (true) { 
     invalidate(); 
    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.GREEN); 
    System.out.println("This line is never printed"); 
} 

Die Haupttätigkeit:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     System.out.println("This line is called"); 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     View myView = findViewById(R.id.myView); 
    } 
} 
+0

Entfernen Sie die 'while' -Schleife im Konstruktor. –

+0

Das hat es behoben. Ich verstehe immer noch nicht, was das Problem war, aber – eikai

+0

Oh, ich habe erst jetzt bemerkt, dass du deinen Kommentar geändert haben musst, während ich geantwortet habe. Ja, die Antwort unten erklärt es. –

Antwort

0

invalidate() nicht dazu führt, onDraw() direkt aufgerufen werden. Es teilt dem System lediglich mit, dass die Ansicht beim nächsten Zeichnungsrahmen neu gezeichnet werden muss. Andernfalls kann das System auf dem nächsten Zeichenrahmen das verwenden, was zuvor gezeichnet wurde, da sich nichts geändert hat. Mit anderen Worten, Ihr Anruf invalidate() und der eventuelle Anruf onDraw() sind asynchron. Wenn Sie eine unendliche while-Schleife in Ihren Konstruktor einfügen, führt der UI-Thread niemals Code über diesen Punkt hinaus aus, so dass das System niemals einen einzigen Layout-Durchlauf durchführt und Ihre Ansicht auch nur einmal gezeichnet wird. Unnötig zu sagen, tun Sie dies nicht.