Appcompatv7 - v21 Panel samping navigasi tidak menampilkan ikon hamburger

101

Saya mengimplementasikan panel navigasi gaya lollipop dengan pustaka dukungan appcompat terbaru tetapi masalahnya adalah ikon hamburger tidak pernah ditampilkan. Hanya ikon kembali yang ditampilkan.

Ini adalah kode aktivitas saya

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

 }
}

Ini adalah file gaya saya

 <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>

File tata letak

<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>

Panel Samping Navigasi Menampilkan Tombol Kembali

Panel Samping Navigasi Menampilkan Tombol Kembali

Dalam kedua kasus hanya panah kembali yang ditampilkan, saya telah membaca banyak posting tetapi sepertinya tidak ada yang membuat perbedaan. Bantuan apa pun akan dihargai.

Ravi
sumber

Jawaban:

148

Anda perlu menelepon

mDrawerToggle.syncState();
Pedro Oliveira
sumber
2
Saya kira di dalam onDrawerClosed () dan onDrawerOpened ()
Paul Verest
14
Tepat setelah Anda menginisialisasiActionBarDrawerToggle
Pedro Oliveira
1
Hai! Bisakah kita menampilkan ikon Hamburger tanpa menelepon mDrawerToggl.syncState(), sebenarnya saya menampilkan panel samping Navigasi sebagai hamparan di ToolBar sehingga animasi tidak diperlukan dalam kasus saya.
Shajeel Afzal
1
Mungkin masalah Anda adalah masalah lain @AlexVPerl. Tidak perlu downvote hanya karena itu tidak berhasil untuk Anda. Sial, jika saya akan menolak semua jawaban yang tidak berhasil untuk saya ....
Pedro Oliveira
1
@PedroOliveira Bukankah itu kasus penggunaan untuk tombol suara naik / turun?
AlexVPerl
19

Pastikan Anda mengimpor toggle laci yang benar.

Ketika saya mengimpor versi v4, saya memiliki panah (di bawah).

import android.support.v4.app.ActionBarDrawerToggle;

Mengubahnya menjadi ini (di bawah, v7) memperbaiki masalah saya.

import android.support.v7.app.ActionBarDrawerToggle;
Donn Felker
sumber
14

Pastikan Anda menelepon

mDrawerToggle.syncState();

SETELAH menelepon

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setHomeButtonEnabled(true); 
Lukas Lechner
sumber
apakah mungkin tanpa menyetel toolbar sebagai actionbar, untuk menampilkan drawable hamburger?
Pengembang android
13

Saat menggunakan ActionBarDrawerToggle, Anda harus memanggilnya selama onPostCreate () dan onConfigurationChanged ()

    @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);
    }
Sathesh
sumber
Dan onOptionsItemSelectedjuga.
Brais Gabin
Tidak membantu saya. Android 6.0
a_subscriber
9

Karena NavigationDrawer saya memperluas Fragmen, bukan Aktivitas, saya tidak dapat mengganti postCreate. Di bawah ini adalah apa yang saya lakukan.

   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

Semoga membantu!

pengguna2132226
sumber
Mungkin perluas sedikit tentang mengapa menurut Anda ini akan membantu orang yang bertanya?
Mikael Ohlson
Maaf mereka ingin ikon hamburger ditampilkan dan cara saya mengubahnya adalah dengan kode di atas. Silahkan baca komentar disamping kode. Ini bisa membantu orang yang terjebak dengan ikon kembali di panel samping navigasi.
pengguna2132226
Bagaimana Anda menampilkan drawable hamburger di toolbar, tanpa menjadikan toolbar sebagai panel tindakan?
Pengembang android
6

Jangan lupa untuk mengganti metode onOptionsItemSelected dan periksa apakah ctionBarDrawerToggle telah diklik, dalam hal ini kembalikan nilai true jika tidak, aktivitas akan selesai.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Alberto Penas
sumber
3
Satu baris:return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
gregschlom
5

Anda cukup menggunakan ini:

// 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);
    }
});
RobotCharlie
sumber
hapus kode setelah mDrawerToggle.syncState () , dan Anda siap melakukannya.
Ahmad Jamil Al Rasyid
3

Saat menyertakan ActionBarDrawerToggle, pastikan untuk menggunakan metode posting:

mDrawerLayout.post(new Runnable() {
   @Override
   public void run() {
       mDrawerToggle.syncState();
   }
});
pengguna3248601
sumber
Ini berhasil untuk saya! Itu dan juga menghapus solusi yang dilakukan dengan menggunakan setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)itu memaksa ikon yang berpura-pura saat beralih antar fragmen. Tetapi setelah diperbarui ke ikon burger animasi baru, itu tidak berhasil.
Jota
3

mDrawerToggle.syncState() tidak berhasil untuk saya, tetapi saya akhirnya berhasil melakukannya:

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

Namun, saya tidak menggunakan Toolbar.

John Leehey
sumber
Baris kode ini menyelamatkan hari saya. Saya telah mengubah kode gerhana saya ke studio android dan tiba-tiba tombol sakelar laci saya otomatis diubah menjadi panah. sekarang berfungsi dengan baik setelah menambahkan baris kode ini. Terima kasih banyak @john Leehey
Hitesh Kamani
3

Saya juga mendapat masalah serupa, dalam kasus saya masalah adalah, ketika memulai actionbartoggle, saya tidak memberikan argumen toolbar yang valid (toolbar diinisialisasi kemudian), tanpa toolbar non-null yang tepat, ActionBarToggle akan gagal membuat ikon hamburger.

actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, 
R.string.drawer_open, R.string.drawer_close);
Shamsul Arefin Sajib
sumber
1

Anda bisa memanggil syncState () dari aktivitas onPostCreate Anda untuk menyinkronkan indikator dengan keadaan DrawerLayout yang ditautkan setelah onRestoreInstanceState terjadi.

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

ActionBarDrawerToggle juga bisa digunakan secara langsung sebagai DrawerLayout.DrawerListener, atau jika Anda sudah menyediakan listener Anda sendiri, panggil setiap metode listener dari Anda sendiri.

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

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

Panel samping navigasi tidak muncul saat mengklik menu bilah tindakan. Ini memperbaikinya untuk saya.

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


        return super.onOptionsItemSelected(item);
    }
Ronny Kibet
sumber
1

Ini berhasil untuk saya. Saya telah memperluas AppCompatActivity dan bukan ActionBarActivity.

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

    }
};
Mahen
sumber