Android - отображение предыдущего фрагмента после перехода в режим «картинка в картинке» - PullRequest
0 голосов
/ 28 апреля 2020

У меня в приложении следующая структура навигации:

 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? Или есть другой способ добиться того, чего я хочу?

1 Ответ

0 голосов
/ 30 апреля 2020

Режим PiP превращает вашу активность в дыру в маленькое окно ... Я считаю, что вам нужно разделить активность видео. Используйте локальную трансляцию, если вы используете wi sh для связи между ними (например, смена видео без сброса действия):)

В этом случае, я думаю, важно, чтобы вы указали android:launchMode="singleTask" в своей манифестной активности декларации, поэтому всякий раз, когда вы запускаете видеоактив, хотя в режиме PiP уже есть экземпляр, он выйдет из режима pip без изменений. Но если вы переопределите метод onNewIntent в видео-активности, вы можете изменить свое видео:)

Если вы не объявите singleTask, у вас может получиться два одинаковых действия.

...