8

Próbuję zmienić ikonę menu hamburgera na NavigationView, ale nie mogę tego zrobić.Zmiana ikony szuflady nawigacji nawigacji

Oto, co starałem tak daleko

Mam działalności podstawowej gdzie konfiguracja nav szuflada jest wykonywana. Oto odpowiedni fragment kodu:

@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); 
} 

Jednak dla mnie to nie działa. Próbowałem również wywoływać setDrawerIndicatorEnabled(false) i na SupportActionBar, ale to również nie działa.

Odpowiedz

20

Poniższy kod działa dobrze dla mnie,

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

miałem też dodać Pasek nawigacyjny kliknij słuchacza nasłuchuj zdarzeń kliknięcia na niestandardowej ikonie szuflady

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); 
      } 
     } 
    }); 
    ... 
} 

Wreszcie mogę zaktualizować ikonę dynamicznie

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

Dodawanie '@Override chronione void onPostCreate (@Nullable Bundle savedInstanceState) { super.onPostCreate (savedInstanceState); nActionBarToggle.syncState(); } @Override publiczny void onConfigurationChanged (Konfiguracja newConfig) { super.onConfigurationChanged (newConfig); nActionBarToggle.onConfigurationChanged (newConfig); } 'pracował dla mnie – captaindroid

+0

dzięki mojej pracy dla mnie –

+0

Zrobiłem dokładnie to, ale mój przełącznik nie jest klikalny. – Yar

0

Czy próbowałeś spojrzeć na dokumentację? http://developer.android.com/training/implementing-navigation/nav-drawer.html

Znalazłem ten fragment kodu, w tym:

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

Chodzi o to, że trzeba zmienić tę ikonę dynamicznie .. muszę pokazać liczbę powiadomień na tę ikonę. –

+0

@AbhishekBansal Muszę również wyświetlić liczbę powiadomień na ikonie hamburgera. Udało ci się to zrobić? –

13

prostu użyć tego:

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

nie trzeba obsłużyć setToolbarNavigationClickListener która w przyjętym odpowiedź.

+3

genialne rozwiązanie –

+0

Bardzo skuteczne rozwiązanie. ale jak mogę przekręcić przycisk hamburgera po kliknięciu? nigdzie się nie skręca, tylko kolor tła jest podświetlony – Zoffa

0

Oto, co działa dla mnie:

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 
} 
Powiązane problemy