2

I have customized back button. when I click on it, the application crashes after a second. here is the code: error log

    private var mBackPressed: Long = 0
    private val timeInterval = 2000



    private fun configBackPress() {
        requireActivity().onBackPressedDispatcher.addCallback(this, true) {
            when {
                mBackPressed + timeInterval > System.currentTimeMillis() -> {
                   
                    requireActivity().onBackPressedDispatcher.onBackPressed()
                }
                else -> {
                    Snackbar.make(
                        requireActivity().findViewById(android.R.id.content),
                        getString(R.string.press_once_again_back_button_to_exit),
                        Snackbar.LENGTH_SHORT
                    )
                        .setAnchorView(viewBinding.vSnackBarHelper)
                        .show()

                    mBackPressed = System.currentTimeMillis()
                }
            }
        }
    }

when the user click two times on back button, the back should work.

Reza
  • 23
  • 5
  • Does this answer your question? [Unfortunately MyApp has stopped. How can I solve this?](https://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this) – a_local_nobody Apr 05 '22 at 07:07
  • Would you mind adding the log with the exception? – gioravered Apr 05 '22 at 07:07
  • Where do you call the `configBackPress` method? It could be a NPE exception on this line `requireActivity().findViewById(android.R.id.content)`. Can you share your XML layout? – lpizzinidev Apr 05 '22 at 07:08

2 Answers2

4

before calling requireActivity().onBackPressedDispatcher.onBackPressed(). you should set isEnabled to false because if we go through the onBackPressed source code we see: enter image description here

it looks for active callbacks and if found any calls them and returns. that's what makes the loop.

your code should be:

isEnabled = false
requireActivity().onBackPressedDispatcher.onBackPressed()
mohsen sameti
  • 381
  • 1
  • 8
0

replace

requireActivity().onBackPressedDispatcher.onBackPressed()

with just

finish()

currently your onBackPressedDispatcher set in Fragment is calling onBackPressed in (required Activity), which will at first try to propagate this event to own childrens - Fragments. so, again, onBackPressedDispatcher will be triggered, again it will call Activitys method and this is loop

edit: isEnabled = false is a better approach, just wanted to leave you some case description

snachmsm
  • 17,866
  • 3
  • 32
  • 74