Как часто вы можете обновлять текст без беспорядка

Предположим, что текстовое представление

TextView tvSum = findViewById(R.id.sumTexviewId); 

Если я хочу изменить отображаемый текст, я делаю это:

 tvSum.setText("£0.00"); 

Теперь, полагая, что я делаю это регулярно, говорю каждый раз, когда нажата кнопка, возможно, показывая сумму, введенную на до. В этом примере вы нажимаете один, он говорит «1p», затем вы нажимаете два, и он говорит «12p» и так далее.

Я нахожу, что если я это сделаю, текст будет искажен через некоторое время. Для последовательности 12345, чтобы начать со всего, хорошо:

  • 0p (Пока ничего не нажата)
  • 1p (Нажатие «1»)
  • 12p (Затем нажмите «2»)
  • £ 1,23 (Затем нажать «3»)

Однако после этого все становится беспорядочным:

  • Mess: £ 12,34 (Затем нажмите «4»)
  • Mess: £ 123,45 (Тогда нажатие «5»)

После этого никогда не будет лучше. Я не размещал код, потому что код действительно очень прост: пучок кнопок и только запись одной короткой строки в один текст – ничего в коде не должно вызывать этого, честный. (Да, я проверил правильно написанную строку, поставив ее на Toast.) Кто-нибудь еще сталкивался с этим, и если да, то что это разрешило?

Оказалось, что мистер Мэй смотрел в правильном направлении, и это как-то связано с тем, как фон создается, когда текст изменяется. Я установил (намеренно) кнопку, чтобы иметь прозрачный фон внутри желтого контура (вместо того, чтобы оставлять его неуказанным), используя цвет 0x00000000.

По какой-то причине при применении не полностью непрозрачных заполнений новый фон закладывается поверх предыдущего содержимого (как я думаю, цикл из примерно 3 растровых изображений), а не для определения содержимого. Я предполагаю, что это, вероятно, связано с режимом передачи PorterDuff по умолчанию, используемым Canvas.

Решения, которые я придумал, изучая это:

  1. Оставьте фон неуказанным. Это также прозрачно, но почему-то активно так.
  2. У вас есть полный альфа-фон. (Даунсайд: не работает, если вам нужна прозрачность)
  3. Напишите пользовательский вид, который переопределяет onDraw чтобы активно заполнять холст с помощью 0x00 перед вызовом super.onDraw() . (Даунсайд: это избавляет от любого фона в этом представлении, но сохраняет Views за этим представлением.

Извинения за высказывание «не делай ничего необычного» – я не понимал, что активная настройка фона на прозрачность считается такой же фантазией!