2014-11-19 9 views
26

Ich habe eine grundlegende ActionBarDrawerToggle mit der neuen Symbolleiste in Android 5.0 implementiert.Wie ersetzt man das Hamburger-Symbol, das für ActionBarToggle verwendet wird, in der Android Toolbar mit einem benutzerdefinierten Zeichensatz?

Ich bin jedoch nicht in der Lage, herauszufinden, wie das Standard-Hamburger-Symbol, das geliefert wird, zu ändern. Aus der Android-Dokumentation heißt es, dass "die angegebene Aktivität mit dem angegebenen DrawerLayout verknüpft wird und das Navigationssymbol der Toolbar auf ein benutzerdefiniertes Zeichen gesetzt wird ... Dieses Zeichen zeigt ein Hamburger-Symbol beim Schließen der Schublade und einen Pfeil bei der Schublade offen. Es animiert zwischen diesen beiden Staaten, wenn sich die Schublade öffnet. "

Ich habe derzeit das alles richtig funktioniert mit dem folgenden Code, aber ich möchte den Standard gelieferten Hamburger mit meinem eigenen Zeichensatz ersetzen.

Hier ist meine aktuellen Code:

MainActivity.java

@InjectView(R.id.main_activity_toolbar) 
Toolbar mToolbar; 

@InjectView(R.id.main_activity_drawer_layout) 
DrawerLayout mDrawerLayout; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setContentView(R.layout.main_activity); 
    super.onCreate(savedInstanceState); 

    setSupportActionBar(mToolbar); 
    mToolbar.setNavigationIcon(R.drawable.navigation); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) { 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      invalidateOptionsMenu(); 
     } 
    }; 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
} 

Diese Zeile:

mToolbar.setNavigationIcon(R.drawable.navigation); 

scheint nicht zu funktionieren.

Ist das möglich? Vielen Dank!

ActionBarToggle Dokumentation - https://developer.android.com/reference/android/support/v7/app/ActionBarDrawerToggle.html

Antwort

23

können Sie die Symbolleiste verwenden als Stand Alone Modus, das heißt, Sie sollten nicht benutzen, um Ihre Symbolleiste als Teil Ihrer ActionBarDrawerToggle Konstruktor, können Sie erreichen, dass die folgenden Code:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, null, 
         R.drawable.appbar, R.drawable.appbar) 

(Beachten Sie, wie die Symbolleiste Instanz nicht an den Konstruktor ActionBarDrawerToggle gesendet werden)

Außerdem sollten Sie Ihr Menü aufblasen manuell

mToolbar = (Toolbar) findViewById(R.id.nav_toolbar); 
mToolbar.inflateMenu(R.menu.base); 

Und entfernen die setSupportActionBar (mToolbar); Codezeile.

Natürlich werden Sie die Navigation Klick selbst behandeln müssen:

mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener() ... 

Dann können Sie Ihre Schublade wie folgt geöffnet:

drawerButton = (BadgeDrawerButton) findViewById(R.id.badge_drawer_button); 
drawerButton.setOnClickListener(
         new View.OnClickListener() { 

           @Override 
           public void onClick(View v) { 
            mDrawerLayout.openDrawer(Gravity.LEFT); 
           } 
         }); 

Hope this helfen können.

+1

Danke für den Rat zu nennen! Das funktioniert, aber wie erhalten Sie das Symbol auf der linken Seite der Menüleiste? Auch müssen Sie verfolgen, ob die Schublade geöffnet ist, um zu wissen, ob Sie openDrawer oder closeDrawer aufrufen sollten, korrigieren? – jet

+1

Wenn Sie die mToolbar.setNavigationIcon (resId) verwenden; es wird es für dich platzieren. Ja, Sie müssen den Schubladenstatus verfolgen (Öffnen, Schließen), aber ich habe diese Zeile aus Platzgründen weggelassen. Bitte markieren Sie die Antwort, wenn dies Ihnen geholfen hat. – Roisgoen

+0

'if (mDrawerLayout.isDrawerOpen()) {mDrawerLayout.closeDrawer (mDrawer); } else {mDrawerLayout.openDrawer (mDrawer); } ' –

1

Hier ist, wie ich endlich meins zur Arbeit bekommen konnte.

private Toolbar toolbar; 
toolbar = (Toolbar) findViewById(R.id.toolbar); 

if (toolbar != null) { 
    setSupportActionBar(toolbar); 
    toolbar.setNavigationIcon(R.drawable.ic_drawer); 

    mDrawerToggle = new ActionBarDrawerToggle(this, 
       mDrawerLayout, 
       toolbar, 
       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); 
     } 

     /** Called when a drawer has settled in a completely open state. */ 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
     } 
    }; 

    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
} 

Es stellte sich heraus das

mDrawerToggle.syncState(); 

sein, dass schließlich alles an die Arbeit.

+0

Ich habe versucht, es funktioniert nicht – WISHY

+0

Not working man. –

6

Meine Lösung ist durch Unterklasse ActionBarDrawerToggle.

public class MyActionBarDrawerToggle extends android.support.v7.app.ActionBarDrawerToggle { 

    public MyActionBarDrawerToggle(Activity activity, final DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { 
     super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); 

     setHomeAsUpIndicator(R.drawable.drawer_toggle); 
     setDrawerIndicatorEnabled(false); 

     setToolbarNavigationClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       drawerLayout.openDrawer(Gravity.LEFT); 
      } 
     }); 
    } 
} 
19

Diese beiden Codezeilen Arbeit für mich:

mDrawerToggle.setDrawerIndicatorEnabled(false); //disable "hamburger to arrow" drawable 
mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); //set your own 

Und dann rufen:

mDrawerToggle.syncState(); 
+0

Hat seine eigenen Probleme. In dem Moment, in dem Sie popBackStack für den fragmentManager verwenden, wird das Symbol "stock hamburger" angezeigt. –

4

die Sache, die für mich gearbeitet ist, dass ich anrufen musste nur toolbar.setNavigationIcon(R.drawable.ic_camera_alt_24dp); am Ende von onCreate oder mindestens nach mDrawerToggle = new ActionBarDrawerToggle...

+0

Funktioniert nicht. Das gleiche Problem wie bei der obigen Antwort: Sobald Sie den Aufwärtspfeil drücken, um die Schublade zu schließen, erscheint vorübergehend das Symbol "Hamburger auf Lager", das dann durch das benutzerdefinierte Symbol ersetzt wird. Ich suche nach einer Lösung, die es vollständig beseitigt. – Zvi

0

Ich denke, es wird empfohlen, den Anruf auf syncState() in der onPostCreate(...) Lifecycle-Methode zu setzen.

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

Das Standardmenü ziehbar für die ActionBarDrawerToggle ist DrawerArrowDrawable.

können Sie Unterklasse Diese benutzerdefinierten Funktionen hinzuzufügen, wie Abzeichen, etwa so:

public class BadgedDrawerArrowDrawable extends DrawerArrowDrawable { 

    /** 
    * @param context used to get the configuration for the drawable from 
    */ 
    public BadgedDrawerArrowDrawable(Context context) { 
     super(context); 

     setColor(context.getResources().getColor(R.color.colorAccent)); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     super.draw(canvas); 

     Paint paint = new Paint(); 
     paint.setStyle(Paint.Style.FILL); 
     paint.setColor(Color.RED); 
     paint.setTextSize(60); 
     canvas.drawText("!", canvas.getWidth() - 60, 25, paint); 
    } 
} 

Verbrauch:

actionBarDrawerToggle.setDrawerArrowDrawable(new BadgedDrawerArrowDrawable(activity)); 
+1

Brilliant. Perfekte Lösung für die Kennzeichnung des Hamburgers. Das einzige, was ich darauf hinweise, ist, dass Paint beim Aufruf von draw() nicht zugewiesen wird. –

0
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawer,toolbar,R.string.navigation_drawer_open,R.string.navigation_drawer_close); 
drawer.setDrawerListener(toggle); 

toggle.syncState(); 
toolbar.setNavigationIcon(R.drawable.ic_action_name); 
+2

Dies wird nicht kompiliert. Ich mache nur Spaß. Bitte erläutern Sie, wie Ihre Lösung funktioniert und wo Sie Ihr Snipped einfügen sollten. – RandomSeed

0

Was v7 Support-Bibliothek - Sie können Ihre eigene Darstellung erstellen von DrawerArrowDrawable.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { 

      public void onDrawerClosed(View view) { 
       supportInvalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View drawerView) { 
       supportInvalidateOptionsMenu(); 
      } 
     }; 
     mDrawerToggle.setDrawerIndicatorEnabled(true); 

     DrawerArrowDrawable drawerArrowDrawable = new DrawerArrowDrawable(this); 
     drawerArrowDrawable.setAlpha(1); 
     drawerArrowDrawable.setSpinEnabled(false); 
     drawerArrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_LEFT); 
     drawerArrowDrawable.setColor(Color.BLACK); 

     mDrawerToggle.setDrawerArrowDrawable(drawerArrowDrawable); 
0

ab Januar 2018 ist dies eine Arbeitslösung (zumindest für mich):

//setSupportActionBar(toolbar) 

    val toggle = ActionBarDrawerToggle(this, drawer_layout, null, R.string.navigation_drawer_open, R.string.navigation_drawer_close) 
    toolbar.inflateMenu(R.menu.menu_main) 
    toolbar.setNavigationIcon(R.drawable.ic_menu) 
    toolbar.setNavigationOnClickListener { 
     drawer_layout.openDrawer(Gravity.START) 
    } 

    toolbar.setOnMenuItemClickListener { 
     true 
    } 

    drawer_layout.addDrawerListener(toggle) 
    toggle.syncState() 

    nav_view.setNavigationItemSelectedListener(this) 

Dinge zu kümmern:

  • setSupportActionBar kommentiert out
  • ActionBarDrawerToggle werden soll bezieht sich nicht auf toolbar
  • Wir sollten das Menü selbst aufblasen und onClicks handhaben. onCreateOptionsMenu und onOptionsItemSelected werden nicht funktionieren.
  • Vergessen Sie nicht, toggle.syncState()