Symbolleistennavigation Hamburger-Symbol fehlt


73

Ich suche nach einer Möglichkeit, das Hamburger-Symbol ohne Verwendung von Drawer / DrawerToggle anzuzeigen und das in Android enthaltene Standardsymbol zu verwenden Geben Sie hier die Bildbeschreibung ein

Durch Einstellen wird getSupportActionBar().setDisplayHomeAsUpEnabled(true);der Zurückpfeil angezeigt, nicht jedoch der Hambuerger. Andere Beiträge auf Stackoverflow (wie dieser oder dieser ) verwenden das DrawerLayout oder ein benutzerdefiniertes Drawable. Ich kann den Vektor oder das PNG für das Hamburger-Symbol in der Android-Quelle nicht finden.

Wissen Sie, wie ich das ursprüngliche Hamburger-Symbol in der Android / Support-Bibliothek finden kann? (oder wie man es anzeigt)

Hinweis: Vektor und PNG finden Sie auf der Website google.com/design: http://www.google.com/design/spec/resources/sticker-sheets-icons.html#

In meiner Tätigkeit

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);

mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d(LOG_TAG, "navigation clicked");
    }
});

Layoutdatei

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar"/>

Styles.xml

<!-- Base application theme. -->
<style name="Theme.AppTheme" parent="Theme.AppCompat.Light.NoActionBar">


    <item name="colorPrimary">@color/primaryDef</item>
    <item name="colorPrimaryDark">@color/primaryDarkDef</item>
    <item name="colorAccent">@color/primaryDef</item>

    <!-- Remove the actionbar shadow-->
    <item name="android:windowContentOverlay">@null</item>
</style>


@ PedroOliveira es ist kein Duplikat, weil ich ausdrücklich sagte, ich habe ActionBarDrawerToggle
Hugo Gresse

Wenn Sie dann keine Schublade verwenden, wie sollen Sie dann ein Menü anzeigen? Dieses Hamburger-Symbol ist Teil der Schublade.
Pedro Oliveira

@PedroOliveira Dies ist nicht die Hauptfrage, aber es wird nicht verwendet, um ein Manu anzuzeigen. Ich weiß, dass es gegen die UX-Richtlinien verstößt und nicht in einer öffentlichen App enthalten sein wird. Die Frage ist nur, das Symbol in Android zu finden, wenn es möglich ist.
Hugo Gresse

@ ASP dies nicht die Frage beantworten
Hugo Gresse

Antworten:


39

Wenn Sie dieselbe Schublade wie Lollipop verwenden möchten, lassen Sie mich Ihnen sagen, dass dies kein statisches Bild ist. Dieses Bild wird in Echtzeit von einer Klasse namens aufgerufen DrawerArrowDrawableToggle. Es gibt also kein "Hamburger" -Symbol dafür.

Wenn Sie jedoch das Hamburger-Symbol ohne Animation möchten, finden Sie es hier:

https://material.io/tools/icons/?icon=menu&style=baseline

Geben Sie hier die Bildbeschreibung ein


Ihre Antwort beantwortet 50% der Frage, danke! Kennen Sie eine Möglichkeit, dies für Pre-Lolipop-Geräte zu implementieren?
Hugo Gresse

Wenn Sie diese schöne Animation mit dem Hamburger-Menü erzielen möchten, empfehlen wir Ihnen, appcompatv7 dafür nachzuschlagen und ein Schubladenmenü einzurichten. Wenn Sie nur das Menüsymbol anzeigen möchten, platzieren Sie das Bild einfach in den Zeichenelementen und verwenden Sie es. Ich werde hier mein Repo mit einer schönen und einfachen Vorlage auf "Material Drawer" veröffentlichen, die auf Pre-Lollipop-Geräten funktioniert :) github.com/kanytu/android-material-drawer-template
Pedro Oliveira

Vielen Dank, können Sie Ihre Antwort mit google.com/design/spec/resources/… vervollständigen, wo wir auch offizielle Symbole finden. Nicht dass Vektorsymbol API 21 erfordert, also müssen wir png
Hugo Gresse

Freund auf dieser Seite müssen Sie nur auf "ZIP herunterladen" klicken und es werden alle PNGs mit der gleichen zeichnbaren Ordnerstruktur heruntergeladen, die das Android-Projekt verwendet :) Gehen Sie einfach dorthin. Wählen Sie Ihre Lieblingsfarbe, klicken Sie auf Zip herunterladen und ziehen Sie diesen "res" -Ordner in Ihren eigenen "res"
Pedro Oliveira

1
Bearbeitet. Macht das den Job? :)
Pedro Oliveira

36

Ein animiertes Hamburger haben Symbol Sie verwenden sollten , DrawerLayoutmit ActionBarDrawerToggleund aktivieren Sie das Symbol für die ActionBarund für die ActionBarDrawerToggle.

Beispiel:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle mDrawerToggle;

setSupportActionBar(toolbar);
final ActionBar actionBar = getSupportActionBar();

if (actionBar != null)
{
   actionBar.setDisplayHomeAsUpEnabled(true);
   mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.hello_world, R.string.hello_world)
   {

      public void onDrawerClosed(View view)
      {
         supportInvalidateOptionsMenu();
         //drawerOpened = false;
      }

      public void onDrawerOpened(View drawerView)
      {
         supportInvalidateOptionsMenu();
         //drawerOpened = true;
      }
   };
   mDrawerToggle.setDrawerIndicatorEnabled(true);
   drawerLayout.setDrawerListener(mDrawerToggle);
   mDrawerToggle.syncState();
}

Außerdem müssen Sie Ihrer Aktivität folgende Methoden hinzufügen:

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

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

Funktioniert in der Tat nicht ... bis ich den fehlenden drawerLayout.syncState erkannte, um das Hamburger-Symbol erscheinen zu lassen :)
ptitvinou

@ptitvinou, siehe aktualisierte Antwort. Ich füge fehlende Methoden hinzu.
Mohax

@mohax wie kann ich nur das hamburguer symbol anstelle des hinteren pfeils anzeigen
Sibelius Seraphini

1
@SibeliusSeraphini, diese Zeile macht es mDrawerToggle.setDrawerIndicatorEnabled(true);. Wenn Sie falseals Argument übergeben, sehen Sie backArrow. Vergessen Sie nicht, 2 Methoden ab dem Ende der Antwort zur Aktivitätsklasse '
hinzuzufügen

1
@mohax Ich muss diese Zeile hinzufügen: mDrawerToggle.syncState (); nach drawerLayout.setDrawerListener (mDrawerToggle);
Sibelius Seraphini

19

Dafür müssen Sie nur in einige Zeilen schreiben

   DrawerLayout drawer = (DrawerLayout) 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.setDrawerIndicatorEnabled(true);
   toggle.syncState();

toggle.setDrawerIndicatorEnabled (true); Wenn dies falsch ist, machen Sie es wahr oder entfernen Sie diese Zeile


Ich kann eins nicht verstehen. Wenn die Hauptfunktion dieses Hamburger-Symbols darin besteht, die Schublade zu öffnen, warum müssen wir dann den Drawlistener separat hinzufügen?
Syed Souban

13

Hier ist die einfachste Lösung, die für mich funktioniert hat.

Das ActionBarDrawerTogglehat zwei Typen Konstruktoren. Einer von ihnen verwendet die Symbolleiste als Parameter. Verwenden Sie diese (zweite unten), um den animierten Hamburger zu erhalten.

ActionBarDrawerToggle(this, mDrawerLayout, R.string.content_desc_drawer_open, 
R.string.content_desc_drawer_close);

ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.content_desc_drawer_open, 
R.string.content_desc_drawer_close);`  //use this constructor

Vielen Dank. Der zweite Konstruktor arbeitete. schön :)
Reza

13

Sie können versuchen, Ihre eigene Zeichnung für das Hamburger-Symbol wie folgt zu erstellen.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z" />
</vector>

Dann in Ihrem Fragment / Aktivität,

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

Bei anderen Drawables kann dies hilfreich sein: https://github.com/google/material-design-icons/blob/master/navigation/drawable-anydpi-v21/



7

Ich hatte das gleiche Problem. Holen Sie sich das ToolBarund setzen Sie dann das Navigationssymbol

final android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.drawable.blablabla);

6
    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
    mToolbar.setTitle("title");
    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_list);

5

ok, um den Pfeil zurück zu verstecken

getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);

Dann finden Sie das Hamburger-Symbol im Web -> Hamburger

und schließlich setzen Sie dieses Zeichen in Ihrem Projekt mit der Aktionsleistenmethode:

getSupportActionBar().setLogo(R.drawable.hamburger_icon);

2
Ich suche das Hamburger-Symbol in der Support-Bibliothek oder Android SDK.
Hugo Gresse

@AlexPerl Vielleicht machst du etwas falsch. Kannst du mir etwas über deinen Fall erzählen?
Stoycho Andreev

4
 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
            R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

Es ist Arbeit mit mir


3

Vielleicht können Sie dies versuchen, aber Sie verlieren die Animation zwischen Pfeil und Hamburger-Symbol

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    super.setContentView(R.layout.activity_menu_drawer_left);

_drawerToggle = new ActionBarDrawerToggle(this, _drawerLayout, R.string.drawer_opened, R.string.drawer_closed) {
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            changeDrawerIconOnDrawerClick(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        }

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            changeDrawerIconOnDrawerClick(R.drawable.ic_drawer);
        }
    };

     //to change default icon to hamburger item initially
    changeDrawerIconOnDrawerClick(R.drawable.ic_drawer);    }



private void changeDrawerIconOnDrawerClick(int resourceId) {
    //Drawable icon = ContextCompat.getDrawable(getApplicationContext(), resourceId);
    Drawable icon = ResourcesCompat.getDrawable(getResources(), resourceId, null);
    icon.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP);
    _drawerToggle.setDrawerIndicatorEnabled(false);
    _drawerToggle.setHomeAsUpIndicator(icon);
}

2

Ersetzen Sie den Standard-Aufwärtspfeil durch Ihren eigenen Zeichnungspfeil

getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger);


2

Fügen Sie Ihrer onCreate-Methode einfach Folgendes hinzu:

if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
        }

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, mDrawer, mToolbar, R.string.home_navigation_drawer_open, R.string.home_navigation_drawer_close) {

            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                invalidateOptionsMenu();
            }

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

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
            }
        };
        mDrawer.addDrawerListener(toggle);
        toggle.syncState();

und In strings.xml,

<string name="home_navigation_drawer_open">Open navigation drawer</string>
<string name="home_navigation_drawer_close">Close navigation drawer</string>

1

Verwenden Sie diesen Konstruktor in MyActionBarDrawerToggle:

    public MyActionBarDrawerToggle(AppCompatActivity host, DrawerLayout drawerlayout, SupportToolbar toolbar, int openedResource, int closedResource)
        : base(host, drawerlayout, toolbar, openedResource, closedResource)
    {
        mHostActivity = host;
        mOpenedResource = openedResource;
        mClosedResource = closedResource;
    }

und Rufen Sie diese Methode in der mainActivity auf (mit AppCompatActivity).

        mDrawerToggle = new MyActionBarDrawerToggle(
            this,                           //Host Activity
            mDrawerLayout,                  //DrawerLayout
            mToolbar,                       //Toolbar
            Resource.String.openDrawer,     //Opened Message
            Resource.String.closeDrawer     //Closed Message
        );


        mDrawerLayout.AddDrawerListener(mDrawerToggle);
        SupportActionBar.SetHomeButtonEnabled(true);
        SupportActionBar.SetDisplayShowTitleEnabled(true);
        mDrawerToggle.DrawerIndicatorEnabled = true;
        mDrawerToggle.SyncState();

1

in onCreate():

    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open, R.string.close) {
        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            supportInvalidateOptionsMenu();
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            supportInvalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);


    drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Backstack.get(MainActivity.this).goBack();
        }
    });
    //actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
    //getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    actionBar.setDisplayHomeAsUpEnabled(false);
    actionBar.setHomeButtonEnabled(true);

Und beim Einrichten der UP-Navigation:

private void setupViewsForKey(Key key) {
    if(key.shouldShowUp()) {
        drawerToggle.setDrawerIndicatorEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    else {
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        drawerToggle.setDrawerIndicatorEnabled(true);
    }
    drawerToggle.syncState();

Ich kann nicht glauben, dass dies mehr als eine Stunde gedauert hat
EpicPandaForce

0

in JetPack funktioniert es für mich

NavigationUI.setupWithNavController(vb.toolbar, nav)
vb.toolbar.navigationIcon = ResourcesCompat.getDrawable(resources, R.drawable.icon_home, null)

Was ist VB in Ihrem Fall hier? Könnten Sie die gesamte Methode / Klasse angeben?
gehorche dem

vbEs ist meine Ansicht
Eugene K
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.