Пользовательский класс представления ' onDraw не вызывается Invalidate

Экран белый, а System.out.println() в onDraw никогда не вызывается.

Это мой activity_main.xml

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

Класс пользовательского представления:

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

Основное направление деятельности:

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

1 ответ

Решение

invalidate() не вызывает onDraw() быть вызванным напрямую. Это просто говорит системе, что вид должен быть перерисован в следующем фрейме рисования. В противном случае в следующем кадре рисования система может использовать то, что было нарисовано ранее, поскольку ничего не изменилось. Другими словами, ваш invalidate() вызов и возможный onDraw() вызов асинхронный.

Кроме того, положить бесконечное while Цикл в вашем конструкторе приведет к тому, что поток пользовательского интерфейса никогда не выполнит код, выходящий за пределы этой точки, поэтому система никогда не выполнит даже один проход макета, и ваше представление никогда не будет отображено ни разу. Само собой разумеется, не делайте этого.

Другие вопросы по тегам