user924
user924

Reputation: 12215

How to return to previous activity when using Navigation Component and Up navigation (back button on toolbar)

First Activity

class MainActivity : AppCompatActivity() {
    private lateinit var navHostFragment: NavHostFragment
    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var navController: NavController
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.lifecycleOwner = this

        navHostFragment =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        navController = navHostFragment.navController

        appBarConfiguration = AppBarConfiguration(setOf(R.id.fragment))
        setupActionBarWithNavController(navController, appBarConfiguration)

        navController.navigate(R.id.secondActivity, SecondActivityArgs(someId = "test").toBundle())
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
}

Second Activity

class SecondActivity : AppCompatActivity() {
    private lateinit var navHostFragment: NavHostFragment
    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var navController: NavController
    private lateinit var binding: ActivitySecondBinding
    private val args: SecondActivityArgs by navArgs()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_second)
        binding.lifecycleOwner = this

        val someId = args.someId

        navHostFragment =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        navController = navHostFragment.navController

        appBarConfiguration = AppBarConfiguration(emptySet())
        setupActionBarWithNavController(navController, appBarConfiguration)
    }

    override fun onSupportNavigateUp(): Boolean {
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
}

Manifest

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".SecondActivity"
    android:parentActivityName=".MainActivity"
    android:exported="true" />

When I'm on the second activity and I press the up button on the toolbar it recreates SecondActivity instead of returning to MainActivity

If I use back button instead of up button then it works fine

What could be a problem and how to fix it?

enter image description here

enter image description here

I press up button and it just destroys the second activity and starts it again

Upvotes: 0

Views: 981

Answers (1)

Mahesh
Mahesh

Reputation: 1267

You can try something like

public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.getItemId() == android.R.id.home)
    {
   
    NavUtils.navigateUpFromSameTask(this); 
    return true;
}

    ...
}

Upvotes: 3

Related Questions