我的布局中有一个自定义视图,我在布局中也有一个TextView,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_alignParentTop="true" android:layout_centerInParent="true"
android:text="Tiny" android:orientation="vertical">
<my.package.drawView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<TextView android:text="Application Name" android:id="@+id/appName"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textSize="30px" android:textStyle="italic" />
</LinerLayout>
我在活动的onCreate方法中设置了对TextView的引用,在我的自定义视图的onDraw方法中,我按如下方式更改了TextView的文本:
public void onDraw(Canvas canvas) {
tv.setText("player score: "+score);
}
但是在ondraw方法中设置文本会导致它进入无限循环。 有人可以告诉我如何在调用自定义视图的onDraw方法中或之后更新TextView的文本。
答案 0 :(得分:1)
当您更改当前视图中的可视内容时,即本例中的textview。整个可见区域被重绘,并且作为其中的一部分,my.package.drawView被告知绘制自己,因此无限循环。
应避免更改onDraw中的视觉属性,并且设计不正确。
也许你需要某种计时器来更新比分或其他在游戏中发生某些事情时会增加分数的地方?
答案 1 :(得分:1)
首先为什么要这样做? 如果您在更改文本后立即调用Text,则会调用Draw。
调用setText将在内部调用invalidate,最终会再次调用onDraw。
如果您只想处理文本更改,请执行TextChangeListner
并完成需要。
不要把这些东西放在onDraw ... onDraw功能应该用来玩画布。
如果你真的想在onDraw上工作,请使用
canvas.drawText(String text, float x, float y, Paint paint)
更多参考:http://developer.android.com/reference/android/graphics/Canvas.html
答案 2 :(得分:0)
当你说它进入无限循环时,你究竟是什么意思?我建议您确保您的自定义视图确实按照您的预期重新绘制。一种简单的方法是在textView中记录您正在更新的内容:
Log.d("my.package.drawView", "player score: "+score);
此日志的打印频率是多少?
答案 3 :(得分:0)
你得到一个无限循环,因为setText调用onDraw,而onDraw调用setText。 如果仅在文本发生更改时调用setText,则可以避免这种情况:
void setTextIfChanged(TextView tv, CharSequence text) {
if (!text.equals(tv.getText()))
tv.setText(text);
}
public void onDraw(Canvas canvas) {
setTextIfChanged(tv, "player score: " + score);
}