Appcompatv7 - v21 Gezinme çekmecesi hamburger simgesini göstermiyor


101

En son appcompat destek kitaplığıyla lolipop stili gezinme çekmecesini uyguluyorum ancak sorun hamburger simgesinin hiçbir zaman görüntülenmemesi. Yalnızca geri simgesi gösterilir.

Bu benim aktivite kodum

import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class Home extends ActionBarActivity {

private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;

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


private void initViews(){

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);


    toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));
    setSupportActionBar(toolbar);

    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);
            //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()
        } 
    }; 


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

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

 }
}

Bu benim stiller dosyam

 <resources>
 <!-- Application theme. -->
<style name="Theme.Test" parent="@style/Theme.AppCompat.Light">

    <!-- customize the color palette -->
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="windowActionBar">false</item>
    <item name="drawerArrowStyle">@style/Theme.Test.DrawerArrowStyle</item>
</style>

<style name="Theme.Test.DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

Düzen dosyası

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >

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

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_below="@+id/toolbar">

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>

Geri Düğmesini Gösteren Gezinme Çekmecesi

Geri Düğmesini Gösteren Gezinme Çekmecesi

Her iki durumda da yalnızca geri ok gösteriliyor, birçok gönderi okudum ancak hiçbir şey bir fark yaratmıyor. Herhangi bir yardım memnuniyetle karşılanacaktır.

Yanıtlar:


148

Araman gerek

mDrawerToggle.syncState();

2
Sanırım onDrawerClosed () ve onDrawerOpened ()
Paul Verest

14
Eğer başlatmak hemen sonraActionBarDrawerToggle
Pedro Oliveira

1
Selam! Hamburger simgesini aramadan gösterebilir miyiz mDrawerToggl.syncState(), aslında Gezinme çekmecesini Araç Çubuğunda kaplama olarak gösteriyorum, bu yüzden benim durumumda animasyon gerekli değil.
Shajeel Afzal

1
Belki senin sorunun başka bir @AlexVPerl. Sizin için işe yaramadı diye olumsuz oy kullanmanıza gerek yok. Cehennem, benim için işe yaramayan tüm cevapları olumsuz oylarsam ....
Pedro Oliveira

1
@PedroOliveira Yukarı / aşağı oy düğmelerinin kullanım durumu bu değil mi?
AlexVPerl

19

Doğru çekmece geçişini içe aktardığınızdan emin olun.

V4 sürümünü içe aktardığımda oka sahiptim (aşağıda).

import android.support.v4.app.ActionBarDrawerToggle;

Bunu buna değiştirmek (aşağıda, v7) sorunumu çözdü.

import android.support.v7.app.ActionBarDrawerToggle;

14

Aradığından emin ol

mDrawerToggle.syncState();

Aradıktan sonra

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

araç çubuğunu eylem çubuğu olarak ayarlamadan hamburger çekmecesini göstermek mümkün müdür?
android geliştiricisi

13

ActionBarDrawerToggle'ı kullanırken, onu onPostCreate () ve onConfigurationChanged () sırasında çağırmalısınız.

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

Ve onOptionsItemSelectedde.
Brais Gabin

Bana yardımcı olmuyor. Android 6.0
a_subscriber

9

NavigationDrawer'ım bir Activity değil bir Fragmenti genişlettiğinden postCreate'i geçersiz kılamadım. Yaptığım şey aşağıdadır.

   ActionBar actionBar = getActionBar();
   actionBar.setDisplayHomeAsUpEnabled(true); // this sets the button to the    back icon
   actionBar.setHomeButtonEnabled(true); // makes it clickable
   actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);// set your own icon

Umarım yardımcı olur!


Belki de bunun soran kişiye neden yardımcı olacağını düşündüğünüzü biraz açıklar mısınız?
Mikael Ohlson

Üzgünüm hamburger simgesinin görüntülenmesini istediler ve bunu değiştirme şeklim yukarıdaki kodla oldu. Lütfen kodun yanındaki yorumları okuyun. Bu, gezinme çekmecesinde arka simgeye takılan kişilere yardımcı olabilir.
user2132226

Araç çubuğunu eylem çubuğu yapmadan hamburger çekmecesini araç çubuğunda nasıl gösterirsiniz?
android geliştiricisi

6

OnOptionsItemSelected yöntemini geçersiz kılmayı unutmayın ve ctionBarDrawerToggle'a tıklanıp tıklanmadığını kontrol edin, bu durumda true değerini döndürün, aksi takdirde etkinlik biter.

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

3
Tek return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
satırlık

5

Bunu basitçe kullanabilirsiniz:

// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
    @Override
    public void run() {
        mDrawerToggle.syncState();
        getActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer);
    }
});

mDrawerToggle.syncState () 'den sonra kodu kaldırın ve gitmeniz iyi olur.
Ahmad Jamil Al Rasyid

3

ActionBarDrawerToggle'ı dahil ederken, gönderi yöntemini kullandığınızdan emin olun:

mDrawerLayout.post(new Runnable() {
   @Override
   public void run() {
       mDrawerToggle.syncState();
   }
});

Bu benim için çalıştı! Bu ve aynı zamanda setHomeAsUpIndicator(R.drawable.ic_menu/ic_back), parça arasında geçiş yaparken taklit edilen simgeyi zorlayan bir geçici çözümü de kaldırmak . Ancak yeni animasyonlu burger simgesine güncellendikten sonra, bu işi yapmaz.
Jota

3

mDrawerToggle.syncState() benim için işe yaramadı, ama sonunda çalışmayı başardım:

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

Ancak bir Araç Çubuğu kullanmıyordum.


Bu kod satırı günümü kurtardı. Tutulma kodumu android stüdyosuna dönüştürdüm ve birden bire çekmecemdeki geçiş düğmesi otomatik olarak oka dönüştü. şimdi bu kod satırını ekledikten sonra sorunsuz çalışıyor. Çok teşekkürler @john Leehey
Kamani

3

Benim durumumda da benzer bir sorunla karşılaştım, benim durumumda, actionbartoggle'ı başlatırken, geçerli bir araç çubuğu argümanını geçmiyordum (araç çubuğu daha sonra başlatıldı), uygun, boş olmayan bir araç çubuğu olmadan, ActionBarToggle bir hamburger simgesi oluşturamaz.

actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, 
R.string.drawer_open, R.string.drawer_close);

1

onRestoreInstanceState gerçekleştikten sonra göstergeyi bağlantılı DrawerLayout durumuyla senkronize etmek için Activity'inizin onPostCreate öğesinden syncState () öğesini çağırabilirsiniz.

@Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

Ayrıca ActionBarDrawerToggle, doğrudan bir DrawerLayout.DrawerListener olarak kullanılabilir veya zaten kendi dinleyicinizi sağlıyorsanız, kendi dinleyici yöntemlerinin her birine çağrı yapın.

private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
  .
  .
  .
  .
mDrawerLayout.setDrawerListener(mDrawerToggle);

    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

1

İşlem çubuğu menüsü tıklandığında gezinme çekmecesi görünmüyordu. Bu benim için düzeltti.

   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
      //add your switch statement


        return super.onOptionsItemSelected(item);
    }

1

Bu benim için çalışıyor. ActionBarActivity yerine AppCompatActivity'yi genişlettim.

mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,null, R.string.drawer_opened, R.string.drawer_closed) {
    @Override
    public void onDrawerOpened(View drawerView) {
        super.onDrawerOpened(drawerView);
        if( getSupportActionBar()!= null)
        getSupportActionBar().setTitle(R.string.drawer_opened);
        mActionBarDrawerToggle.syncState();
    }

    @Override
    public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);
        if(getSupportActionBar() != null)
            getSupportActionBar().setTitle(R.string.drawer_closed);
            mActionBarDrawerToggle.syncState();

    }
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.