我正在使用Android的WebView和Jetpack导航组件开发一个小型web浏览器。
当我在主页上加载URL,然后导航到设置页面,然后回到主页,WebView重新加载自己时,问题就出现了。即使我在ViewModel中保存其状态到Bundle
,也会以某种方式记住上次webview的页面并重新加载该URL。但那不是我想要的。我想保存STATE指的是与WebView相关的一切,比如滚动条的位置,如果有视频,那么搜索栏在视频上的位置,等等。如果有什么需要我帮忙的,请告诉我。
我是这样实现的
ViewModel:
class WebViewModel: ViewModel() {
var webViewState: Bundle = Bundle()
}
HomeFragment:
class HomeFragment : Fragment(){
private lateinit var binding: FragmentHomeBinding
private lateinit var webView: CustomWebView
private val viewModel: WebViewModel by viewModels()
override fun onPause() {
super.onPause()
Log.i(TAG, "onPause: ")
webView.saveState(viewModel.webViewState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentHomeBinding.inflate(
inflater,
container,
false
)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews()
}
private fun initViews() {
webView = CustomWebView(requireContext())
binding.apply {
frameLayout.addView(webView)
layoutBottomBar.rLTextBarContainer.setOnClickListener {
showSearchFragment()
}
layoutBottomBar.ivBottomMenu.setOnClickListener {
showBottomMenu()
}
layoutBottomBar.ivRefreshOrCancel.setOnClickListener {
refreshOrCancelClicked()
}
}
if (viewModel.webViewState.isEmpty) {
Log.i(TAG, "initViews: WebViewModel webViewState is empty")
webView.loadUrl("https://google.com")
} else
webView.restoreState(viewModel.webViewState)
}
}
有一个解决方法。那就是将webview对象保存到viewmodel中。但是您应该意识到可能的内存泄漏和其他问题并处理它们。为了处理内存泄漏,一个步骤是在onViewDestroy生命周期回调中手动分离webview,并在onViewCreated生命周期回调中附加它。