setText TextView в методе onDraw пользовательского представления в Android - PullRequest
1 голос
/ 23 декабря 2011

У меня есть пользовательский вид в моем макете, и у меня также есть 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>

Я устанавливаю ссылку на TextView в методе onCreate действия и в методе onDraw моего пользовательского представления я изменяю текст TextView следующим образом:

public void onDraw(Canvas canvas) {
    tv.setText("player score: "+score);
}

Но установка текста в методе ondraw приводит к его бесконечному циклу. Может кто-нибудь сказать мне, как мне обновить текст TextView в или после вызова метода onDraw пользовательского представления.

Ответы [ 4 ]

1 голос
/ 23 декабря 2011

Когда вы изменяете визуальную вещь в текущем представлении, т.е. в этом случае текстовое представление.Вся видимая область перерисовывается, и как часть этого my.package.drawView велено рисовать себя и, следовательно, бесконечный цикл.

Следует избегать изменения визуальных свойств в onDraw, и дизайн неверен.

Может быть, вам нужен какой-то таймер для обновления счета или где-то еще, что увеличивает счет, когда что-то происходит в игре?

1 голос
/ 23 декабря 2011

Во-первых, почему ты хочешь это сделать? На Draw в случае TextView будет вызван, как только вы измените текст ..

Вызов setText вызовет недействительность, что в конечном итоге приведет к повторному вызову onDraw.

В случае, если вы хотите обработать только текстовое изменение, тогда внедрите TextChangeListner и выполните все необходимое.

Не помещайте этот материал в onDraw ... Функцию onDraw следует использовать для игры с canvas.

Если вы действительно хотите работать в onDraw, используйте

canvas.drawText(String text, float x, float y, Paint paint)

подробнее: http://developer.android.com/reference/android/graphics/Canvas.html

0 голосов
/ 15 сентября 2014

Вы получаете бесконечный цикл, потому что 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);
}
0 голосов
/ 23 декабря 2011

Что именно вы имеете в виду, когда говорите, что оно входит в бесконечный цикл? Я предлагаю вам убедиться, что ваш пользовательский вид действительно перерисовывается так, как вы этого ожидаете. Простой способ сделать это - зарегистрировать все, что вы обновляете, в textView:

Log.d("my.package.drawView", "player score: "+score);

Как часто печатается этот журнал?

...