8

Я пытаюсь изменить значок меню гамбургера для NavigationView, но я не могу этого сделать.Измените значок ящика для гаджета

Вот что я пытался до сих пор

У меня есть базовая активность, где делается установка нав ящик. Вот соответствующий фрагмент кода

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

Однако, похоже, он не работает для меня. Я также пытался позвонить setDrawerIndicatorEnabled(false) и setHomeAsUpIndicator(R.drawable.ic_share_48pt_2x) по телефону SupportActionBar, но это также не работает.

ответ

20

Следующий код работает хорошо для меня,

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

Я также должен был добавить панель навигации клик слушателя прослушивание событий кликов на значке пользовательского ящика

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

Наконец, я могу обновить значок динамически

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

Добавление '@Override protected void onPostCreate (@Nullable Bundle savedInstanceState) { super.onPostCreate (savedInstanceState); nActionBarToggle.syncState(); } @Override public void onConfigurationChanged (Конфигурация newConfig) { super.onConfigurationChanged (newConfig); nActionBarToggle.onConfigurationChanged (newConfig); } 'работал для меня – captaindroid

+0

благодаря его работе для меня –

+0

Я сделал именно так, но мой переключатель не доступен для кликов. – Yar

0

Вы пытаетесь посмотреть документацию? http://developer.android.com/training/implementing-navigation/nav-drawer.html

Я нашел этот кусок кода в нем:

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

Вещи мне нужно изменить этот значок динамически .. Мне нужно, чтобы показать количество уведомлений об этой иконе. –

+0

@AbhishekBansal Мне нужно показать количество уведомлений на значок гамбургера. Вы справились? –

13

Просто используйте:

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

Вам не нужно обрабатывать setToolbarNavigationClickListener, который в общепринятом ответ.

+3

блестящее решение –

+0

Очень эффективное решение. но как я могу повернуть кнопку гамбургера, когда она нажата? он нигде не поворачивается, подсвечивается только цвет фона – Zoffa

0

Вот что работает для меня:

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 
}