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()
}
}
}
}