2015-04-22 2 views
2

Я застрял в проблеме 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 не был создан.

+0

Если SurfaceView в 'onSurfaceDestroyed()' вызывается, то 'onSurfaceCreated()' должен называться. 'onSurfaceChanged()' вызывается при изменении размера или формата поверхности. Обратите внимание, что они вызываются инфраструктурой приложения - никогда не вызывайте их из приложения. Некоторые дополнительные замечания можно найти здесь: https://source.android.com/devices/graphics/architecture.html#activity – fadden

+0

Спасибо за ваш комментарий. Я позволяю фреймворку вызывать эти обратные вызовы самостоятельно, но проблема заключается в том, что я не создаю представление, которое должно быть правильно нарисовано внутри фрагмента A. Я снова отлаживал и обнаружил, что фрагмент A не вызывает 'onCreateView()', а 'onResume()', когда он возвращается к активности A из активности B, и фрагмент отображается. Довольно беспорядок, чтобы объяснить: P. Завтра я постараюсь выяснить это странное поведение. – JorgeGRC

+0

@fadden Я обновил этот вопрос немного подробнее. 'onSurfaceCreated()' не запускается, когда фрагмент становится видимым снова, хотя 'onSurfaceDestroyed()' вызывается, когда фрагмент больше не отображается из-за переключателя активности. – JorgeGRC

ответ

4

Я до сих пор не знаю, почему андроид рамки не будет создавать SurfaceView на своем собственном, но все, что я должен был сделать, чтобы заставить ВИДИМОСТЬ View «s к VISIBLE и что сделал трюк. SurfaceHolder обратные вызовы начал работать, как и ожидалось, когда я явно сказал View быть видимым в onResume() способе Fragment:

myView.setVisibility(View.VISIBLE); 
+1

Все, что я хотел сделать с моим ответом, это ответить на вопрос. 'SurfaceView' не был создан (я думаю), потому что видимость' view', возможно, не была «VISIBLE». В любом случае, если вы считаете, что лучше отредактировать вопрос и сохранить его открытым, я бы отредактировал его, добавив эту новую информацию. – JorgeGRC

+0

Я думаю, что это лучше всего как ответ, как вы это сделали. Возможно, другие комментаторы не понимали, что это решает вашу проблему, хотя по-прежнему остается загадкой, почему Android не сделал этого сам по себе. – ToolmakerSteve

Смежные вопросы