1

im trying to navigate from webview to fragment using navController, but it seems not working.

here is my code

 class LandingPageCreditCardFragment : Fragment(R.layout.fragment_landing_page_credit_card) {

private val binding by viewBinding(FragmentLandingPageCreditCardBinding::bind)
lateinit var navController: NavController

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    navController = view.findNavController()
    Log.i("link url", arguments?.getString("url").toString())
    showWebViewContent(requireArguments().getString("url")!!)
}

private fun showWebViewContent(url: String) {
    binding.webViewCreditCard.settings.javaScriptEnabled = true
    binding.webViewCreditCard.webViewClient = object : WebViewClient() {
        override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
            if (url != null) {
                view?.loadUrl(url)
            }
            return true
        }
    }
    binding.webViewCreditCard.addJavascriptInterface(object : Any() {
        @JavascriptInterface
        fun valid() {
            Toast.makeText(requireContext(), "test", Toast.LENGTH_SHORT).show()
            val builder = AlertDialog.Builder(requireContext())
            builder.setTitle("Konfirmasi")
            builder.setMessage("navigasi ke pesanan")
            builder.setPositiveButton("Ya") { dialog, which ->
                navController.navigate(R.id.action_landingPageCreditCardFragment_to_pesananFragment)
                dialog.dismiss()
            }
            builder.setNegativeButton("Tidak") { dialog, which ->
                dialog.dismiss()
            }
            builder.show()            }
    }, "btn")
    binding.webViewCreditCard.loadUrl(url)
} }

im referrring to this answer to get my function working

i try to show toast, its working then im try to show alertDialog contain button to navigate from webview to next fragment, when i click it, my app crash.

any help appreciated

Pif
  • 530
  • 2
  • 10
  • 20

1 Answers1

1

after much debugging, i found the answer.

call the navController in runOnUiThread wrapped on Thread and Handler

binding.webViewCreditCard.addJavascriptInterface(object : Any() {
        @JavascriptInterface
        fun valid() {
            val handler = Handler(Looper.getMainLooper())
            handler.post(Thread {
                (activity as MainActivity).runOnUiThread {
                    navController.navigate(R.id.action_landingPageCreditCardFragment_to_pesananFragment)
                }
            })
        }
    }, "btn")
Pif
  • 530
  • 2
  • 10
  • 20