Invalidate не может вызвать onDraw при возврате к действию, которое имеет настраиваемое представление

Я унаследовал некоторый код, поэтому у меня нет истинной свободы изменять его.:(

У меня есть основной вид деятельности, из которого вызываются другие виды деятельности (с этого момента я буду называть их подвидом). Всякий раз, когда один из них завершается, он вызывает финиш и возвращает данные в основное действие.

Каждое действие (включая основное) имеет панель в верхней части, которая отображает пользовательское представление. Пользовательский вид содержит холст, на котором есть рисунок, который зависит от состояния сети... т.е. Wi-Fi / мобильный и т. Д...

Поскольку эти данные "состояния" никогда не меняются, они хранятся в единственном объекте, и представление получает данные из единственного объекта, чтобы определить, что именно оно рисует. Это работает без проблем, то есть данные всегда такие, как я ожидаю.

Когда я впервые запускаю MainActivity, когда сеть меняется, данные меняются, и каждый вызов для "аннулирования" представления получает системный вызов "onDraw", как и следовало ожидать.

В каждом из подвидов деятельности опять то же самое.

После завершения дочернего действия и возврата к mainActivity, вызовы аннулирования больше не вызывают вызов onDraw.

Я уже давно смотрю на это и просто не могу понять, что происходит не так.

В моем конструкторе у меня есть:

setWillNotDraw(false);

Всякий раз, когда данные изменяются, вызываются следующие методы:

invalidate();
requestLayout();

Теперь есть еще одна вещь... возвращаясь к действию в тот момент, я обновляюсь, и это ДЕЙСТВИТЕЛЬНО рисует правильно, то есть при аннулировании действительно вызывает вызов onDraw... любые последующие изменения в сети (которые распространяются) не приводят к вызов onDraw.

Мне интересно, связано ли это с тем, что представление каким-то образом отстранено. Я вижу, что вызывается onDetachedFromWindow, однако триггером для этого является уничтожение субактивности, поэтому я не понимаю, почему это должно влиять на MainActivity, но это единственное, о чем я могу думать.

Я надеюсь, что предоставил достаточно информации, чтобы кто-то помог мне...

1 ответ

Ну, в конце концов, мой ответ имеет очень мало общего с вопросом, и я думаю, что это пример того, как можно решить проблему, вернувшись к абсолютным основам и проверив очевидное.

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

Так что, если бы я смог опубликовать весь код, я уверен, что кто-то еще заметил бы это, но, к сожалению, я не смог в этом случае.

Тем не менее, хотя эта публикация не предоставляет решение, которое поможет другим, возможно, оно говорит... отойдите назад и сначала проверьте очевидное!

Другие вопросы по тегам