У меня в приложении следующая структура навигации:
MainActivity -> VideoListFragment -> VideoShowingFragment
(only activity, (shows a list of Video (gets the URL of the video to
container for items via a Recycler- show and plays the video via
all the other View, the URL of the ExoPlayer. From here, the user
fragments) Video is passed to can enter PiP mode)
next Fragment)
Таким образом, при запуске приложения пользователю отображается список Video
элементов. Когда пользователь щелкает элемент, URL-адрес передается в VideoShowingFragment
, который отображает пользователю содержимое Video
через PlayerView
из библиотеки ExoPlayer
. Вверху PlayerView
есть значок, позволяющий пользователю переходить в режим PiP, когда он щелкает по нему.
Ввод PiP работает и все в порядке, но у меня вопрос, как я могу показать список видео после перехода в режим PiP? Что я имею в виду: когда пользователь находится на этапе VideoShowingFragment
и решает минимизировать содержимое Video
, войдя в режим PiP, как я могу показать ему список Video
s (VideoListFragment
), чтобы он мог просматривать список, все еще просматривая контент в режиме PiP?
Ситуация сейчас следующая: пользователь переходит в режим PiP, но пользователь видит стартовый экран своего устройства, пока видеоконтент минимизируется в правый нижний угол.
Вот некоторые важные части моего проекта:
<!-- AndroidManifest.xml -->
<application
...>
<activity
android:name=".MainActivity"
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Как уже упоминалось, VideoListFragment
переходит к ShowingVideoFragment
при нажатии:
videoListFragmentViewModel.openVideoEvent.observe(viewLifecycleOwner, EventObserver{ videoUri -> findNavController().navigate(VideoListFragmentDirections.actionVideoListFragmentToVideoShowingFragment(videoUri))})
Затем ShowingFragment
получает данные, необходимые для отображения видео. Я не буду углубляться в это, потому что это просто типичные вещи ExoPlayer
.
Также в ShowingFragment
у нас есть логика c для перехода в режим PiP:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = FragmentVideoShowingBinding.inflate(inflater, container, false)
// listener on icon with ID 'pipMode'
binding.pipMode.setOnClickListener{ enablePipMode() }
return binding.root
}
private fun enablePipMode() {
// set aspect ratio
picInPicParamsBuilder.setAspectRatio(Rational(binding.playerView.width, binding.playerView.height))
// enter the PiP mode
activity?.enterPictureInPictureMode(picInPicParamsBuilder.build())
}
// override to make the icon on top of PlayerView eiter visible or invisible
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode)
if(isInPictureInPictureMode){
binding.pipMode.visibility = View.GONE
}
else{
binding.pipMode.visibility = View.VISIBLE
}
}
Нужно ли размещать VideoShowingFragment
во втором упражнении, когда я хочу позволить пользователю просматривать выбранное видео в режиме PiP при просмотре VideoListFragment
? Или есть другой способ добиться того, чего я хочу?