Обработка состояния игры внутри фрагмента веб-просмотра

Я использую архитектуру с одним действием и имею 3 фрагмента (фрагмент A, фрагмент B и фрагмент C). Нажмите кнопку во фрагменте A, чтобы перейти к фрагменту B, а нажмите кнопку во фрагменте B, чтобы перейти к фрагменту C (который представляет собой веб-просмотр, внутри него работает игра). Теперь я хочу вернуться к фрагменту B и хочу, чтобы игра была приостановлена. и снова, когда я вернусь к фрагменту C из B, я хочу, чтобы игра была в состоянии паузы

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

Когда я использую NavigationUp() при возвращении из C в B, он уничтожает фрагмент C и воссоздает его при переходе к C из B, и игра начинается заново.

Есть какие-нибудь предложения, как справиться с этим сценарием с помощью компонента навигации?

1 ответ

Вы можете добиться этого, используя ViewModel и onSaveInstanceState(), чтобы сохранить и восстановить состояние вашего WebView и игры внутри него.

  1. Создайте ViewModel, который будет содержать ссылку на ваш WebView:
      class WebViewViewModel : ViewModel() {
    var webView: WebView? = null
}
  1. В вашем фрагменте C получите ссылку на ViewModel и установите WebView:
      private lateinit var webViewViewModel: WebViewViewModel

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    webViewViewModel = ViewModelProvider(requireActivity()).get(WebViewViewModel::class.java)

    if (webViewViewModel.webView == null) {
        webViewViewModel.webView = WebView(requireContext()).apply {
            // Initialize and load the game URL here
        }
    }

    // Add the WebView to your layout
    fragment_c_layout.addView(webViewViewModel.webView)
}
  1. Переопределите onSaveInstanceState() во фрагменте C, чтобы сохранить состояние WebView:
      override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    webViewViewModel.webView?.saveState(outState)
}
  1. Восстановите состояние WebView при возврате к фрагменту C:
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    webViewViewModel = ViewModelProvider(requireActivity()).get(WebViewViewModel::class.java)

    if (webViewViewModel.webView == null) {
        webViewViewModel.webView = WebView(requireContext()).apply {
            // Initialize and load the game URL here
        }
    } else if (savedInstanceState != null) {
        // Restore the WebView state
        webViewViewModel.webView?.restoreState(savedInstanceState)
    }

    // Add the WebView to your layout
    fragment_c_layout.addView(webViewViewModel.webView)
}

Таким образом, когда вы вернетесь от фрагмента C к фрагменту B, WebView и состояние игры будут сохранены во ViewModel. Когда вы снова перейдете к фрагменту C, состояние WebView будет восстановлено, и игра окажется в состоянии паузы.

Примечание. Возможно, вам придется изменить код игры, чтобы приостановить/возобновить игру на основе состояния WebView, если игра не обрабатывает его автоматически. Кроме того, обязательно управляйте жизненным циклом WebView (например, onPause, onResume и onDestroy) в вашем фрагменте C.

Другие вопросы по тегам