'onPageStarted/onPageFinished not updating view and crash

I have an activity where I setup an animated AnimatedVector on an ImageView then I am loading an url in a WebView, everythings good right here.

The issue is in onPageStarted webview client callback, I got a crash because binding.loader.drawable return null so the cast is impossible.

I can't figure it out why the drawable is null here !

Second issue is (if i comment the line in onPageStarted) in onPageFinished, the two visibility of my views I try to set does nothing at all, they are still visibles. Spoiler : Of course the app crash right after when trying to get the drawable and cast it

Have you already face this issue ?

class ViewRecipeActivity : AppCompatActivity() {
    private val binding by viewBinding(ActivityViewRecipeBinding::inflate)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        setupUI()
    }
    
    //region setup UI
    private fun setupUI() {
        setUpLoader()
        setupWebView()
    }
    
    private fun setUpLoader() {
        with(binding.loader) {
            val drawable = AnimatedVectorDrawableCompat.create(this@ViewRecipeActivity, R.drawable.animated_loader)
            setImageDrawable(drawable)
        }
    }
    
    private fun setupWebView() {
        val client = object : WebViewClient() {
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                (binding.loader.drawable as Animatable).start()  //Crash here because drawable is null
            }
    
            override fun onPageFinished(view: WebView?, url: String?) {
                binding.loader.visibility = View.GONE
                binding.loaderBackground.visibility = View.GONE
                (binding.loader.drawable as Animatable).stop()
            }
        }
        
        with(binding.recipeView) {
            webViewClient = client
        }
        
        val recipeUrl = intent.extras?.getString(RECIPE_URL_EXTRA)
    
        if(recipeUrl == null) {
            Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show()
        } else {
            binding.recipeView.loadUrl(recipeUrl)
        }
    }
    //endregion
    
    companion object {
        const val RECIPE_URL_EXTRA = "recipe_url_extra"
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source