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.

Jawaban:


148

Anda perlu menelepon

mDrawerToggle.syncState();

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;

14

Pastikan Anda menelepon

mDrawerToggle.syncState();

SETELAH menelepon

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

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

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!


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

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

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

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.


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

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

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

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

    }
};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.