Streaming VideoView - Изменения ориентации - Различные макеты для альбомной и портретной ориентации

Я работаю над приложением для потокового видео, таким как YouTube. Я использую встроенную функцию потоковой передачи VideoView.

Я использую Fragments, поэтому на телефонах есть оболочка Activity вокруг VideoFragment. Пользовательский интерфейс должен быть похож на YouTube, поэтому в портретной ориентации вверху воспроизводится видео, а под ним несколько дополнительных видов и т. д., а в альбомной ориентации все, что есть, — это полноэкранное видео.

У меня проблемы с изменением ориентации, и я, очевидно, хочу, чтобы видео продолжало воспроизводиться при изменении ориентации. Как я уже сказал, видео передается в потоковом режиме, поэтому простое сохранение текущего времени видео не поможет. Единственный способ, которым мне удалось это сделать, - заставить не перезапускать активность с android:configChanges="keyboardHidden|orientation|screenSize", установленным для активности-оболочки в манифесте.

Таким образом, это прекрасно работает, но терпит неудачу, когда я хочу иметь разные макеты для layout и layout-land, как это делает YouTube, потому что активность не перезапускается, поэтому у фрагмента нет возможности загрузить новый макет, насколько я знать.

Спасибо!


person urSus    schedule 04.09.2013    source источник
comment
theres no oportunity for fragment to load new layout Это можно сделать, но тогда может возникнуть проблема: so just persisting the current video time is not going to cut it.   -  person Vikram    schedule 04.09.2013
comment
Переопределите onConfigurationChanged(Configuration) в своей деятельности. Он будет вызываться при изменении ориентации. Создайте новый фрагмент, который содержит вашу программу просмотра видео, и используйте FragmentTransaction.replace(int, Fragment) для переключения фрагментов. Теперь внутри onCreateView() этого фрагмента у вас должен быть оператор if-else, проверяющий текущую ориентацию: if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // inflate landscape view } else { // inflate load portrait }. Я не думаю, что это решит вашу проблему, но вы можете попробовать.   -  person Vikram    schedule 04.09.2013
comment
но это уничтожит видеопросмотр и его буфер, верно? Я мог бы также позволить ему перезапуститься и изменить макет естественным образом.   -  person urSus    schedule 04.09.2013
comment
Как я уже сказал в своем первом комментарии, This can be done, but then, this might be a problem: so just persisting the current video time is not going to cut it: некоторые полезные ссылки: изменение ориентации Android VideoView с буферизованным видео, Изменение макета при изменении ориентации во время выполнения во фрагменте без пересоздания вида.   -  person Vikram    schedule 04.09.2013
comment
да, оптимальным решением было бы сохранение буфера в каком-то сохраненном фрагменте без макета или что-то в этом роде, который затем передал бы буфер новому видеопросмотру, верно?   -  person urSus    schedule 04.09.2013
comment
@urSus, как вы решили свою проблему, я столкнулся с той же проблемой?   -  person Erum    schedule 17.09.2015