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