In Kotlin ..How I can return from fragment to Main

2019-07-30 17:55发布

问题:

in my program I have MainActivity and many fragments.. I try the following code to return from fragment to MainActivity by onBackpressed() method

override fun onBackPressed() {

    if(drawer_layout.isDrawerOpen(GravityCompat.START)) {
        drawer_layout.closeDrawer(GravityCompat.START)
    }
    else  if (fragment != null) {
    val intent = Intent(applicationContext, MainActivity::class.java)
    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
    startActivity(intent)

     }


    else {
       super.onBackPressed()
    }
}

My first problem is:

it working good with Drawer and also open MainActivity but program not closed ..these main that

super.onBackPressed()

not working ..why

My second problem is:

after else If I need to use

getActivity().onBackpressed()

instead of the old one..

Thanks All

回答1:

Activities navigate to Activities via onBackPressed(). Fragments have to reside in an Activity (They are basically sub-Activities), so it doesn't make sense to navigate from a Fragment to an Activity via super.onBackPressed(). You should be navigating from Fragment to Fragment, or if you forgo Fragments then Activity to Activity.

To navigate back to the previous Fragment:

activity?.fragmentManager?.popBackStack()

To navigate to the previous activity:

activity?.finish()

or

onBackPressed()

or, from the activity if you have overriden the onBackPressed() method:

super.onBackPressed()

Without more context to your code I can't say either why it seems your final else statement is never called. It seems like you've got a bug with your if else statement as super.onBackPressed() would provide the desired result of closing whatever activity you were in (MainActivity?).

else  if (fragment != null) {
val intent = Intent(applicationContext, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)

 }

My guess is it has something to do with you creating another instance of MainActivity. On first back pressed you close the drawer. On the second you create another instance of MainActivity and navigate to it. On the third, even if super.onBackPressed() gets called it will navigate back to the first instance of MainActivity where fragment will probably never be null unless you're specifically assigning such, so on the fourth you create another instance of MainActivity and navigate to it. This is a loop that will never navigate back from the first MainActivity.

Suggestions: However you're displaying MainActivity, convert it to a Fragment and handle it accordingly. Another approach is instead of creating another instance of MainActivity hide the fragmentView and show the MainActivity view. I don't suggest setting your fragment to null as the fragmentManager may throw and error, so you should also change your if else logic to check for something else. Say maybe fragment.view.visibility == View.Visible if you go the route described.



回答2:

For your first question as far as I can understand you should use

val activity = activity as MainActivity
activity.onBackPressed()

because super for your fragment is not MainActivity.