I'm encountering a NullPointerException in my Android app when trying to load a WebView inside a Fragment. The error occurs specifically in the onProgressChanged() method of the WebViewClient. Here's the relevant part of the stack trace:
java.lang.NullPointerException at com.example.card.SettingsFragment.getBinding(SettingsFragment.kt:36) at com.example.card.SettingsFragment.access$getBinding(SettingsFragment.kt:34) at com.example.card.SettingsFragment$onViewCreated$1.onProgressChanged(SettingsFragment.kt:53)
And here's the code snippet:
class SettingsFragment : Fragment() {
private var _binding: FragmentSettingsBinding? = null
private val binding get() = _binding!!
private val TAG = "SettingsFragment"
private lateinit var webView: WebView
val url = "https://example.com"
@SuppressLint("SetJavaScriptEnabled")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
webView = binding.webviewForDigiLocker
webView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) {
super.onProgressChanged(view, newProgress)
Log.e(TAG, "$newProgress")
//here causing problem
binding.progressBar.progress = newProgress
if (newProgress == 100) {
binding.loader.visibility = View.GONE
binding.progressBar.visibility = View.GONE
}
}
}
webView.webViewClient = object : WebViewClient() {
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
Log.e(TAG, "PageStarted")
binding.progressBar.visibility = View.VISIBLE
binding.loader.visibility = View.VISIBLE
}
}
webView.settings.javaScriptEnabled = true
webView.settings.allowContentAccess = true
webView.settings.domStorageEnabled = true
webView.isSaveEnabled = true
webView.loadUrl(url)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
_binding = FragmentSettingsBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
Log.e(TAG,"DestroyView")
}
}
It seems like the binding object is null when trying to access binding.progressBar and binding.loader, causing the NullPointerException. However, I'm not sure why this is happening, as I've properly initialized the binding object in onCreateView(). I am also making it null when in OnDestroyView
Any insights on why this error might be occurring and how to resolve it would be greatly appreciated. Thanks!