8

Sto cercando di cambiare l'icona del menu hamburger per NavigationView ma non riesco a farlo.Cambiare icona del cassetto di navigazione icona hamburger

Ecco quello che ho provato finora

ho un'attività di base in cui viene effettuato l'installazione del cassetto nav. Qui è il pezzo di codice rilevante

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setContentView(R.layout.activity_base_nav); 
    setSupportActionBar(toolbar); 
    setupDrawer(); 
} 

private void setupDrawer() { 
    mDrawerLayout.setDrawerListener(this); 

    mDrawerToggle = new ActionBarDrawerToggle(this, 
      mDrawerLayout, 
      R.string.open, 
      R.string.close); 

    mDrawerToggle = new ActionBarDrawerToggle(mContext, 
      mDrawerLayout, 
      R.string.open, 
      R.string.close); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (getSupportActionBar() != null) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(false); 
     mDrawerToggle.setDrawerIndicatorEnabled(false); 
     mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_share_48pt_2x); 
    } 
    mDrawerToggle.syncState(); 

    mNavigationView.setNavigationItemSelectedListener(
      menuItem -> { 
       mMenuItem = menuItem.getItemId(); 
       mDrawerUtil.onNavMenuItemClicked(mMenuItem); 
       mDrawerLayout.closeDrawers(); 
       return true; 
      }); 
} 

@Override 
public void setContentView(int layoutResID) { 
    getLayoutInflater().inflate(layoutResID, mContainer); 
} 


@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

Tuttavia, non sembra funzionare per me. Ho anche provato a chiamare setDrawerIndicatorEnabled(false) e setHomeAsUpIndicator(R.drawable.ic_share_48pt_2x) su SupportActionBar ma anche questo non funziona.

risposta

20

Il seguente codice funziona bene per me,

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(false); 
    toggle.setDrawerIndicatorEnabled(false); 
    toggle.setHomeAsUpIndicator(R.drawable.ic_custom_drawer_icon); 
    ... 
} 

ho anche dovuto aggiungere un listener barra degli strumenti di navigazione clicca per ascolta gli eventi click sull'icona del cassetto personalizzato

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    toggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
      if (drawer.isDrawerOpen(GravityCompat.START)) { 
       drawer.closeDrawer(GravityCompat.START); 
      } else { 
       drawer.openDrawer(GravityCompat.START); 
      } 
     } 
    }); 
    ... 
} 

Infine, posso aggiornare l'icona in modo dinamico come

toggle.setHomeAsUpIndicator(R.drawable.ic_new_icon); 
+1

Aggiunta di '@Override protetto non valido onPostCreate (@Nullable Bundle savedInstanceState) { super.onPostCreate (savedInstanceState); nActionBarToggle.syncState(); } @Override public void onConfigurationChanged (Configuration newConfig) { super.onConfigurationChanged (newConfig); nActionBarToggle.onConfigurationChanged (newConfig); } 'ha funzionato per me – captaindroid

+0

grazie al suo lavoro per me –

+0

Ho fatto esattamente così, ma il mio interruttore non è selezionabile. – Yar

0

Hai provato a guardare la documentazione? http://developer.android.com/training/implementing-navigation/nav-drawer.html

ho trovato questo pezzo di codice in esso:

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 

      /** Called when a drawer has settled in a completely closed state.*/ 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 

      /** Called when a drawer has settled in a completely open state. */ 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
     }; 
+0

cosa è che ho bisogno di cambiare questo Icona dinamicamente .. Ho bisogno di mostrare il numero di notifiche su questa icona. –

+0

@AbhishekBansal Devo mostrare anche il numero di notifiche sull'icona dell'hamburger. L'hai gestito? –

13

Basta usare questo:

toolbar.post(new Runnable() { 
      @Override 
      public void run() { 
       Drawable d = ResourcesCompat.getDrawable(getResources(), R.mipmap.ic_launcher, null); 
       toolbar.setNavigationIcon(d); 
      } 
     }); 

Non avete bisogno di gestire setToolbarNavigationClickListener che è in risposta accettata.

+3

soluzione brillante –

+0

Soluzione molto efficace. ma come posso attivare il pulsante dell'hamburger quando viene cliccato? non sta girando da nessuna parte, solo il colore di sfondo è evidenziato – Zoffa

0

Ecco ciò che funziona per me:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
    setSupportActionBar(toolbar) 

    val toggle = ActionBarDrawerToggle(
      this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) 
    //toggle.isDrawerSlideAnimationEnabled = false 
    toggle.isDrawerIndicatorEnabled = false 
    toggle.setToolbarNavigationClickListener { 
     if (drawer_layout.isDrawerOpen(GravityCompat.START)) 
      drawer_layout.closeDrawer(GravityCompat.START) 
     else 
      drawer_layout.openDrawer(GravityCompat.START) 
    } 
    toggle.setHomeAsUpIndicator(AppCompatResources.getDrawable(this, R.drawable.ic_android_black_24dp)) 
    drawer_layout.addDrawerListener(toggle) 
    toggle.syncState() 
    nav_view.setNavigationItemSelectedListener(this) 
} 

override fun onBackPressed() { 
    if (drawer_layout.isDrawerOpen(GravityCompat.START)) { 
     drawer_layout.closeDrawer(GravityCompat.START) 
    } else { 
     super.onBackPressed() 
    } 
} 

override fun onNavigationItemSelected(item: MenuItem): Boolean { 
    when (item.itemId) { 
     ... 
    } 
    drawer_layout.closeDrawer(GravityCompat.START) 
    return true 
}