Andorid backstack showing white screen

17 Views Asked by At

In my app there is main activity when i navigate from mainactivity to a tripactivity and in tripactivity there are bottom navigation and i three fragment in which i lock one fragment as deafault and two fragments by bottom clicks .

here suppose the main fragment is A and i navigate A-->B and when i come back to A and then A-->MainActivity by click back press it show a white screen on that tripactivity and not going to main acitvity..

class TripActivity : AppCompatActivity() {

    private var currentFragment: Fragment? = null
    private var _binding: ActivityTripBinding? = null
    private val binding get() = _binding!!
    lateinit var editTripFragment: EditTripFragment
    lateinit var expenseFragment: ExpenseFragment
    lateinit var tripDetailFragment: TripDetailFragment
    lateinit var currentTrip: TripTable

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        _binding = ActivityTripBinding.inflate(layoutInflater)
        setContentView(binding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        editTripFragment = EditTripFragment()
        expenseFragment = ExpenseFragment()
        tripDetailFragment = TripDetailFragment()

        val receivedBundle = intent.extras
        currentTrip = receivedBundle?.getParcelable<TripTable>(Constants.ARG_SELECTED_TRIP)!!

        if (savedInstanceState == null) {
            replaceFragment(tripDetailFragment)
            currentFragment = tripDetailFragment
        } else {
            currentFragment = supportFragmentManager.findFragmentById(R.id.fragContainer)
        }
        currentFragment?.let {
            binding.bottomNavigation.selectedItemId = it.id
        }


        setupBottomNavigationBar()
    }

    override fun onResume() {
        super.onResume()

//        binding.bottomNavigation.selectedItemId == currentFragment?.id
    }

    private fun setupBottomNavigationBar() {
        binding.bottomNavigation.setOnItemSelectedListener { item ->

            val newFragment = when (item.itemId) {

                R.id.expense -> expenseFragment
                R.id.editTrip -> editTripFragment
                R.id.delete -> {
                    AlertDialogHelper.showAlertDialog(
                        this,
                        "Delete TRIP?",
                        R.drawable.bin,
                        "DELETE",
                        "CANCEL",
                        {
                            Toast.makeText(this, "Positive Button Clicked", Toast.LENGTH_SHORT)
                                .show()
                        },
                        {
                            replaceFragment(tripDetailFragment)
                        }

                    )
                    currentFragment
                }

                else -> tripDetailFragment
            }

            if (newFragment != currentFragment) {
                replaceFragment(newFragment as Fragment)
                currentFragment = newFragment
                if (newFragment != tripDetailFragment) {
                    binding.bottomNavigation.visibility = View.GONE
                }

                Log.d("current frag", currentFragment.toString())
            }

            true
        }
    }


    private fun replaceFragment(fragment: Fragment) {

        if (fragment == tripDetailFragment) {
            binding.bottomNavigation.visibility = View.VISIBLE
        }
        val bundle = Bundle().apply {
            putParcelable(Constants.ARG_SELECTED_TRIP, currentTrip)
        }

        fragment.arguments = bundle

        val transaction = supportFragmentManager.beginTransaction()
            .setCustomAnimations(R.anim.right_to_left, R.anim.left_to_right)
        transaction.replace(R.id.fragContainer, fragment)
        transaction.addToBackStack(null)
        transaction.commit()

    }

    override fun onBackPressed() {
        if (currentFragment == tripDetailFragment) {
            finish()
        } else {
            super.onBackPressed()
        }
    }```



class TripDetailFragment : Fragment() {

private var _binding: FragmentTripDetailBinding? = null
private val binding get() = _binding!!

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val onBackPressedCallback = object : OnBackPressedCallback(true ) {
        override fun handleOnBackPressed() {

            navigateBack()
        }
    }
        requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback)

}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = FragmentTripDetailBinding.inflate(layoutInflater)
    return binding.root
}

private fun navigateBack() {
    parentFragmentManager.popBackStack()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null

}

}



class EditTripFragment : Fragment() {

private var _binding: FragmentEditTripBinding? = null
private val binding get() = _binding!!

private lateinit var startDate: String
private lateinit var endDate: String

private var _toolbarBinding: ToolBarBinding? = null
private val toolbarBinding get() = _toolbarBinding!!


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            showDiscard()
        }
    })
}


override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    _binding = FragmentEditTripBinding.inflate(layoutInflater)
    _toolbarBinding = ToolBarBinding.bind(binding.toolbar.root)

    return binding.root

}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val trip:TripTable? = arguments?.getParcelable(Constants.ARG_SELECTED_TRIP)


    setTripData(trip)
   // toolbarBinding.toolbar.title = "Edit Trip"
    toolbarBinding.title.text="Edit Trip"
    toolbarBinding.icon.setOnClickListener {
        showDiscard()
    }


}

private fun setTripData(trip: TripTable?) {
    if (trip != null) {
        val date="${trip.startDate} - ${trip.endDate}"
        binding.tripName.text=trip.tripName.toEditable()
        binding.tripLocation.text=trip.tripLocation.toEditable()
        binding.selectedDate.visibility=View.VISIBLE
        binding.selectedCurr.visibility=View.VISIBLE
        binding.selectedCurr.text=trip.currency
        binding.selectedDate.text=date.toString()
    } else {

        Log.e("error in edit trip", error("some error occurred"))
    }

}


override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
    _toolbarBinding = null
}

fun showDiscard():Boolean{

    AlertDialogHelper.showAlertDialog(
        requireActivity(),
        "Discard Changes?",
        R.drawable.bin,
        "DISCARD",
        "",
        {
            parentFragmentManager.popBackStack()
        },
        {

        }

    )
   return false
}

// Extension function to convert String to Editable
private fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)



here i want that when i press back from edittrip it comes to detailtrip and then backpress it goes to mainactivity .

   MainActivity --> tripActivity( detail-->edittrip-->deatil-->)-->mainActivity
0

There are 0 best solutions below