Обработка состояния игры внутри фрагмента веб-просмотра
Я использую архитектуру с одним действием и имею 3 фрагмента (фрагмент A, фрагмент B и фрагмент C). Нажмите кнопку во фрагменте A, чтобы перейти к фрагменту B, а нажмите кнопку во фрагменте B, чтобы перейти к фрагменту C (который представляет собой веб-просмотр, внутри него работает игра). Теперь я хочу вернуться к фрагменту B и хочу, чтобы игра была приостановлена. и снова, когда я вернусь к фрагменту C из B, я хочу, чтобы игра была в состоянии паузы
Я использую компонент навигации для навигации между фрагментами.
Когда я использую NavigationUp() при возвращении из C в B, он уничтожает фрагмент C и воссоздает его при переходе к C из B, и игра начинается заново.
Есть какие-нибудь предложения, как справиться с этим сценарием с помощью компонента навигации?
1 ответ
Вы можете добиться этого, используя ViewModel и onSaveInstanceState(), чтобы сохранить и восстановить состояние вашего WebView и игры внутри него.
- Создайте ViewModel, который будет содержать ссылку на ваш WebView:
class WebViewViewModel : ViewModel() {
var webView: WebView? = null
}
- В вашем фрагменте 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)
}
- Переопределите onSaveInstanceState() во фрагменте C, чтобы сохранить состояние WebView:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
webViewViewModel.webView?.saveState(outState)
}
- Восстановите состояние 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.