0

I write a callback with hilt and it good work when I test it just for call. But when I use like bellow get me *throw catch*:

My Interface is:

interface ButtonCallback {
    fun onButtonClick()
}

And Module:

@Module
@InstallIn(ActivityComponent::class)
interface ButtonCallbackModule {
    @Binds
    fun bindButtonCallback(activity: MainActivity): ButtonCallback
}

And Handler:

class ButtonHandler @Inject constructor(private val callback: ButtonCallback) {
    fun setButtonClickListener(imageButton: ImageButton) {
        imageButton.setOnClickListener {
            // Invoke the callback function
            callback.onButtonClick()
        }
    }
}

I am using in Activity and Fragment like bellow:

@AndroidEntryPoint
class MainActivity @Inject constructor() : AppCompatActivity(), ButtonCallback {
...

    override fun onButtonClick() {
        when (navController.currentDestination?.id) {
            R.id.navigation_lessons, R.id.navigation_lightner, R.id.navigation_quiz, R.id.navigation_profile, R.id.navigation_news -> {
                if (onBackPressedDispatcher.hasEnabledCallbacks()) {
                    onBackPressedDispatcher.onBackPressed()
                } else {
                    navController.navigateUp()
                }
            }
            else -> {
                navController.navigateUp()
            }
        }
    }
...
}

And:

@AndroidEntryPoint
class NewsFragment : Fragment() {
    @Inject
    lateinit var buttonCallback: ButtonHandler
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
...
        binding.imgBackNews.setOnClickListener {
            buttonCallback.setButtonClickListener(binding.imgBackNews)
        }
...
}
}

override fun onAttach(context: Context) {
    super.onAttach(context)
    try {
        buttonCallback =
            context as ButtonHandler // callback instance
    } catch (e: ClassCastException) {
        throw ClassCastException("Calling Fragment must implement ButtonCallback")
    }
}

My problem is here (onAttach) how can I resolve this line (buttonCallback = context as ButtonHandler) for run these line navController.currentDestination?.id .....

My MainActivity is like bellow:

@AndroidEntryPoint
class MainActivity @Inject constructor() : AppCompatActivity(), ButtonCallback {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
initNavigation()
}
    private lateinit var navController: NavController
    private fun initNavigation() {
        val navHost =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment
        navController = navHost.navController
        val navView: BottomNavigationView = binding.navViewManin
        NavigationUI.setupWithNavController(navView, navController)
        binding.navViewManin.setupWithNavController(navController)
        binding.navViewManin.setOnNavigationItemReselectedListener {
            "Reselect blocked."
        }

    }

    override fun onButtonClick() {
        when (navController.currentDestination?.id) {
            R.id.navigation_lessons, R.id.navigation_lightner, R.id.navigation_quiz, R.id.navigation_profile, R.id.navigation_news -> {
                if (onBackPressedDispatcher.hasEnabledCallbacks()) {
                    onBackPressedDispatcher.onBackPressed()
                } else {
                    navController.navigateUp()
                }
            }
            else -> {
                navController.navigateUp()
            }
        }
    }
}
jo jo
  • 1,758
  • 3
  • 20
  • 34

0 Answers0