Java 自定义视图类';onDraw不是';t由Invalidate调用
屏幕是白色的&onDraw-in中的System.out.println()从未调用 这是我的activity_main.xmlJava 自定义视图类';onDraw不是';t由Invalidate调用,java,android,view,ondraw,android-view-invalidate,Java,Android,View,Ondraw,Android View Invalidate,屏幕是白色的&onDraw-in中的System.out.println()从未调用 这是我的activity_main.xml <foo.packagename.MyView android:id="@+id/myView" android:layout_width="fill_parent" android:layout_height="fill_parent"/> 主要活动: public class MainActivity extends AppC
<foo.packagename.MyView
android:id="@+id/myView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
主要活动:
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);
}
}
invalidate()
不会导致直接调用onDraw()
。它只是告诉系统需要在下一个绘图帧上重新绘制视图。否则,在下一个绘图框上,系统可以使用先前绘制的内容,因为没有任何更改。换句话说,您的invalidate()
调用和最终的onDraw()
调用是异步的
此外,在构造函数中放置无限
while
循环将导致UI线程永远不会执行超过该点的代码,因此系统甚至永远不会完成一次布局过程,也永远不会绘制一次视图。不用说,不要这样做。去掉构造函数中的而循环。这就解决了它。我还是不明白问题出在哪里。哦,我刚才才注意到你一定是在我回复时改变了你的评论。是的,下面的答案解释了这一点。
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);
}
}