Я застрял в проблеме SurfaceView
, и эта проблема, похоже, связана с каким-либо непониманием того, как работают эти обратные вызовы SurfaceView
.onSurfaceCreated() не вызывается, когда активность возобновляется
Давайте попробуем решить эту theorethicaly:
У меня есть деятельность , хостинг fragment
которого чертеж объекта в режиме реального времени, управляя thread
к acomplish этой задачи (вызов методы рисования моего View
периодически и нарисовать его на SurfaceView
).
Затем переключитесь на активность B, в которой размещен еще один фрагмент, показывающий некоторый пользовательский интерфейс.
Когда я переключаюсь на это действие B, я вижу, что SurfaceView
уничтожается, поэтому вызывается обратный вызов onSurfaceDestroyed()
, и я останавливаю там нить чертежа.
Все очень хорошо и очевидно сейчас, но когда я возвращаюсь к деятельности , то SurfaceView
не создается, поэтому onSurfaceCreated()
не называется, и, таким образом, мой рисунок нить не будет.
При отладке, я могу видеть мой View
существует, когда я вернусь из В к , и это можно сделать, если поток был запущен, но мой поток бежать, мне нужно SurfaceView
быть создан снова ,
Итак, мой вопрос (под редакцией):
Почему SurfaceView
не создается, когда я вернулся к фрагменту если фрагмент виден?
Извините, я не могу предоставить какой-либо код для этого вопроса, но он более теоретичен, чем любой другой.
EDIT: обновление Прогресса
После этого некоторых дополнительных исследований и тестирования, я понял, что любой осколок onCreateView()
вызывается только один раз в этом время жизни, до тех пор пока он удален из диспетчера фрагментов и больше не управляется инфраструктурой.
SurfaceView
не разрушается, когда фрагмент, который использует его становится уже не видно, перед вызовом это onDestroyView()
, но, к сожалению (и я не понимаю, почему) это не воссозданы, когда он становится видимым, и это источник моей проблемы. Мне нужно, чтобы SurfaceView
был создан снова, когда этот фрагмент становится видимым, поэтому он может запускать мой поток чертежа, поскольку инфраструктура вызывает onSurfaceCreated()
.
Макет, который я пытаюсь сделать, состоит из двух видов, один из которых управляется каркасом, а другой - с использованием SurfaceView.Когда я вернусь к Занятости A от B, я знаю, что фрагмент виден, потому что я вижу вид, которым управляет структура, нарисованная соответствующим образом, но не отслеживается ни один управляемый потоком, который начинается, когда создается SurfaceView
, так как этот SurfaceView
не был создан.
Если SurfaceView в 'onSurfaceDestroyed()' вызывается, то 'onSurfaceCreated()' должен называться. 'onSurfaceChanged()' вызывается при изменении размера или формата поверхности. Обратите внимание, что они вызываются инфраструктурой приложения - никогда не вызывайте их из приложения. Некоторые дополнительные замечания можно найти здесь: https://source.android.com/devices/graphics/architecture.html#activity – fadden
Спасибо за ваш комментарий. Я позволяю фреймворку вызывать эти обратные вызовы самостоятельно, но проблема заключается в том, что я не создаю представление, которое должно быть правильно нарисовано внутри фрагмента A. Я снова отлаживал и обнаружил, что фрагмент A не вызывает 'onCreateView()', а 'onResume()', когда он возвращается к активности A из активности B, и фрагмент отображается. Довольно беспорядок, чтобы объяснить: P. Завтра я постараюсь выяснить это странное поведение. – JorgeGRC
@fadden Я обновил этот вопрос немного подробнее. 'onSurfaceCreated()' не запускается, когда фрагмент становится видимым снова, хотя 'onSurfaceDestroyed()' вызывается, когда фрагмент больше не отображается из-за переключателя активности. – JorgeGRC