Предположим, что текстовое представление
TextView tvSum = findViewById(R.id.sumTexviewId);
Если я хочу изменить отображаемый текст, я делаю это:
tvSum.setText("£0.00");
Теперь, полагая, что я делаю это регулярно, говорю каждый раз, когда нажата кнопка, возможно, показывая сумму, введенную на до. В этом примере вы нажимаете один, он говорит «1p», затем вы нажимаете два, и он говорит «12p» и так далее.
Я нахожу, что если я это сделаю, текст будет искажен через некоторое время. Для последовательности 12345, чтобы начать со всего, хорошо:
Однако после этого все становится беспорядочным:
После этого никогда не будет лучше. Я не размещал код, потому что код действительно очень прост: пучок кнопок и только запись одной короткой строки в один текст – ничего в коде не должно вызывать этого, честный. (Да, я проверил правильно написанную строку, поставив ее на Toast.) Кто-нибудь еще сталкивался с этим, и если да, то что это разрешило?
Оказалось, что мистер Мэй смотрел в правильном направлении, и это как-то связано с тем, как фон создается, когда текст изменяется. Я установил (намеренно) кнопку, чтобы иметь прозрачный фон внутри желтого контура (вместо того, чтобы оставлять его неуказанным), используя цвет 0x00000000.
По какой-то причине при применении не полностью непрозрачных заполнений новый фон закладывается поверх предыдущего содержимого (как я думаю, цикл из примерно 3 растровых изображений), а не для определения содержимого. Я предполагаю, что это, вероятно, связано с режимом передачи PorterDuff по умолчанию, используемым Canvas.
Решения, которые я придумал, изучая это:
onDraw
чтобы активно заполнять холст с помощью 0x00 перед вызовом super.onDraw()
. (Даунсайд: это избавляет от любого фона в этом представлении, но сохраняет Views за этим представлением. Извинения за высказывание «не делай ничего необычного» – я не понимал, что активная настройка фона на прозрачность считается такой же фантазией!