Reputation: 155
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.
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
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
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
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