Freudi
Freudi

Reputation: 155

How to get Back Button in Actionbar with new Jetpack navigation

I want to have a Backbutton in the default Actionbar on an new androidx jetpack navigation App.

I follow the google navigation-getting-started to build a navigation app, but I'm missing a Backbutton in the Actionbar so I add in the OnCreate of the MainActivity:

        ActionBar actionbar = getSupportActionBar();
        NavController nc = Navigation.findNavController(mainFragment.getView());
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(nc.getGraph()).build();
        androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(this,nc, appBarConfiguration); 

Now I see a Backbutton in the ActionBar if I'm not in the start main fragment, but there is no back function if I tap that button. The regular back-key works fine, but how do I get the actionbar backbutton to work.

enter image description here

Update: It is not working from second fragment to first(main/root) fragment. from third to second fragment it is working. nav-graph

Upvotes: 4

Views: 3327

Answers (3)

Sachin
Sachin

Reputation: 1

   //Implement like this in your fragment

     class BackButtonWithMenu : Fragment() {
            private val menuProvider = object : MenuProvider {
                    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
                        menuInflater.inflate(R.menu.BackButton_frag_menu, menu)
                    }
            
                    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
                        return when (menuItem.itemId) {
                            R.id.termsBtn -> {
                                navigateToIntroductionPage()
                                false //check this
                            }
                            else -> false //check this
                        }
                    }
                }
            
            //set ActionBar to .show
            override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                    super.onViewCreated(view, savedInstanceState)
                    (requireActivity() as AppCompatActivity).supportActionBar?.show()

val menuHost: MenuHost = requireActivity()
            menuHost.addMenuProvider(menuProvider, viewLifecycleOwner, Lifecycle.State.RESUMED)
            
            }
        
        //Add these fun in your activity
        override fun onNavigateUp(): Boolean {
                return navController.navigateUp(appBarConfiguration)
            }
        
            override fun onSupportNavigateUp(): Boolean {
                onBackPressed()
                return true
            }

Upvotes: 0

Freudi
Freudi

Reputation: 155

package com.pg.navigation;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NavUtils;
import androidx.fragment.app.Fragment;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;

import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity implements main_fragment.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, fragment3.OnFragmentInteractionListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Fragment mainFragment = getSupportFragmentManager().findFragmentById(R.id.fragment);
        ActionBar actionbar = getSupportActionBar();
        NavController nc = Navigation.findNavController(mainFragment.getView());
        AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(nc.getGraph()).build();
        androidx.navigation.ui.NavigationUI.setupActionBarWithNavController(this,nc, appBarConfiguration);
    }

    @Override
    public boolean onSupportNavigateUp() {
        return super.onSupportNavigateUp();
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        return super.onOptionsItemSelected(item);
    }
}

Upvotes: 0

Sandeep Malik
Sandeep Malik

Reputation: 1976

try this :-

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //do your stuff here
            }
        });

second option is;-

@Override
    public boolean onSupportNavigateUp() {
        return super.onSupportNavigateUp();
        // do your stuff here
    }

Upvotes: 1

Related Questions