Android – Cambie el botón Atrás de ActionBar al botón de navegación

Tengo el siguiente problema:

Sé cómo configurar una barra de herramientas para mostrar un ícono de botón de retroceso en lugar de un ícono de botón de hamburguesa.

De esto:
enter image description here

a esto:

enter image description here

utilizando: getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Ahora, quiero hacer la acción inversa, quiero ir desde el ícono del botón Atrás al ícono de la hamburguesa:

enter image description here

hacia aqui:

enter image description here

¿Cómo puedo hacer esto?

Actualizar:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); } private void enableViews(boolean enable) { if(enable) { // Enables back button icon getSupportActionBar().setDisplayHomeAsUpEnabled(true); } else { // TODO: Enables burger icon } } 

Si asumo que estás usando android.support.v4.widget.DrawerLayout en tu diseño, entonces este enfoque puede funcionar para ti; Solo he probado en API 21 pero dado que usa principalmente las bibliotecas de soporte, debería funcionar (últimas palabras famosas) en objectives inferiores o superiores.

 import android.support.v7.app.ActionBarDrawerToggle import android.support.v4.widget.DrawerLayout ActionBarDrawerToggle mDrawerToggle; DrawerLayout drawerLayout; private boolean mToolBarNavigationListenerIsRegistered = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); // Get DrawerLayout ref from layout drawerLayout = (DrawerLayout)findViewById(R.id.drawer); // Initialize ActionBarDrawerToggle, which will control toggle of hamburger. // You set the values of R.string.open and R.string.close accordingly. // Also, you can implement drawer toggle listener if you want. mDrawerToggle = new ActionBarDrawerToggle (this, drawerLayout, mToolbar, R.string.open, R.string.close); // Setting the actionbarToggle to drawer layout drawerLayout.setDrawerListener(mDrawerToggle); // Calling sync state is necessary to show your hamburger icon... // or so I hear. Doesn't hurt including it even if you find it works // without it on your test device(s) mDrawerToggle.syncState(); } /** * To be semantically or contextually correct, maybe change the name * and signature of this function to something like: * * private void showBackButton(boolean show) * Just a suggestion. */ private void enableViews(boolean enable) { // To keep states of ActionBar and ActionBarDrawerToggle synchronized, // when you enable on one, you disable on the other. // And as you may notice, the order for this operation is disable first, then enable - VERY VERY IMPORTANT. if(enable) { //You may not want to open the drawer on swipe from the left in this case drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); // Remove hamburger mDrawerToggle.setDrawerIndicatorEnabled(false); // Show back button getSupportActionBar().setDisplayHomeAsUpEnabled(true); // when DrawerToggle is disabled ie setDrawerIndicatorEnabled(false), navigation icon // clicks are disabled ie the UP button will not work. // We need to add a listener, as in below, so DrawerToggle will forward // click events to this listener. if(!mToolBarNavigationListenerIsRegistered) { mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Doesn't have to be onBackPressed onBackPressed(); } }); mToolBarNavigationListenerIsRegistered = true; } } else { //You must regain the power of swipe for the drawer. drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); // Remove back button getSupportActionBar().setDisplayHomeAsUpEnabled(false); // Show hamburger mDrawerToggle.setDrawerIndicatorEnabled(true); // Remove the/any drawer toggle listener mDrawerToggle.setToolbarNavigationClickListener(null); mToolBarNavigationListenerIsRegistered = false; } // So, one may think "Hmm why not simplify to: // ..... // getSupportActionBar().setDisplayHomeAsUpEnabled(enable); // mDrawer.setDrawerIndicatorEnabled(!enable); // ...... // To re-iterate, the order in which you enable and disable views IS important #dontSimplify. } 

La solución usa ActionBarDrawerToggle.setDrawerIndicatorEnabled para alternar la visibilidad del ícono de la hamburguesa y ActionBar.setDisplayHomeAsUpEnabled para la visibilidad del botón Arriba , esencialmente haciendo uso de sus respectivos recursos drawable .

Otras suposiciones

  • Su tema de Actividad extiende Theme.AppCompat.Light.NoActionBar .

Encontré soluciones flexibles en la aplicación para Android Google I / O 2017 .

 public Toolbar getToolbar() { if (mToolbar == null) { mToolbar = (Toolbar) findViewById(R.id.toolbar); if (mToolbar != null) { setSupportActionBar(mToolbar); mToolbar.setNavigationContentDescription(R.string.navdrawer_description_a11y); mToolbarTitle = (TextView) mToolbar.findViewById(R.id.toolbar_title); if (mToolbarTitle != null) { int titleId = getNavigationTitleId(); if (titleId != 0) { mToolbarTitle.setText(titleId); } } // We use our own toolbar title, so hide the default one getSupportActionBar().setDisplayShowTitleEnabled(false); } } return mToolbar; } /** * @param clickListener The {@link android.view.View.OnClickListener} for the navigation icon of * the toolbar. */ protected void setToolbarAsUp(View.OnClickListener clickListener) { // Initialise the toolbar getToolbar(); if (mToolbar != null) { mToolbar.setNavigationIcon(R.drawable.ic_up); mToolbar.setNavigationContentDescription(R.string.close_and_go_back); mToolbar.setNavigationOnClickListener(clickListener); } } 

Entonces el uso es realmente simple.

 setToolbarAsUp(new View.OnClickListener() { @Override public void onClick(View v) { // onBackPressed(); // or navigate to parent or some other intent } }); 

puedes cambiar el botón de la barra de acciones con:

  getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_button); getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Utilizar esta

 getSupportActionBar().setDisplayShowHomeEnabled(true); 
  final Toolbar toolbar = (Toolbar) findViewById(R.id.actionbar); toolbar.setTitle(Html.fromHtml("" + getString(R.string.print_s) + "")); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.menu_icon)); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DetailActivity.this.finish(); } }); toolbar.inflateMenu(R.menu.fav); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { item.setIcon(R.drawable.back_icon) return true; } return false; } }); 

Intente agregar el código de style AppTheme al activity's theme/style.xml su activity's theme/style.xml hará que su hamburger icon back icon con animation .

Condición si está utilizando el icono de hamburguesas con NavigationDrawer y AppCompatActivity/ActionBarActivity

   

¡Espero que ayude! o simplemente tienes que hacerlo con dibujable solamente.

Ver este enlace

Para mí, quería cambiar el ícono de Burger por un ícono de Back Arrow en el lado izquierdo de ActionBar de Fragment ya que estoy usando un Navigation Drawer . También agregando un menú en el lado derecho.

En la Actividad principal , ya está configurado, de forma predeterminada, cuando Android Studio crea el Cajón de navegación para mí, así:

 Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); 

El problema es cómo personalizar la ActionBar de ActionBar en el Fragment , así que cuando vaya al Fragment me mostrará la ActionBar personalizada y cuando se ActionBar en el icono de flecha hacia atrás , dejará el fragmento y la ActionBar volverá al primer estado.

En Fragment ( implementación completa ):

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); // To show the menu options } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); showActionBar(); // the method to change ActionBar } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // inflate the customized menu which already created in XML getActivity().getMenuInflater().inflate(R.menu.fragment_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { // add implementation when user select an item from the menu switch (item.getItemId()) { case R.id.option1: // do something return true; case R.id.option2: // do something return true; case R.id.option3: // do something return true; default: return super.onOptionsItemSelected(item); } } private void showActionBar() { // get the ToolBar from Main Activity final Toolbar toolbar = getActivity().findViewById(R.id.toolbar); // get the ActionBar from Main Activity final ActionBar actionBar = ((AppCompatActivity)getActivity()).getSupportActionBar(); // inflate the customized Action Bar View LayoutInflater inflater = (LayoutInflater) getActivity() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.fragment_actionbar, null); if (actionBar != null) { // enable the customized view and disable title actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowTitleEnabled(false); actionBar.setCustomView(v); // remove Burger Icon toolbar.setNavigationIcon(null); // add click listener to the back arrow icon v.findViewById(R.id.back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // reverse back the show actionBar.setDisplayShowCustomEnabled(false); actionBar.setDisplayShowTitleEnabled(true); //get the Drawer and DrawerToggle from Main Activity // set them back as normal DrawerLayout drawer = getActivity().findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( getActivity(), drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); // All that to re-synchronize the Drawer State toggle.syncState(); // Implement Back Arrow Icon // so it goes back to previous Fragment getActivity().onBackPressed(); } }); } } 

fragment_actionbar.xml

     

ic_menu_back.xml

    

fragment_menu.xml