Appcompatv7 - v21 Ngăn điều hướng không hiển thị biểu tượng bánh hamburger


101

Tôi đang triển khai ngăn điều hướng kiểu kẹo mút với thư viện hỗ trợ appcompat mới nhất nhưng vấn đề là biểu tượng bánh hamburger không bao giờ được hiển thị. Chỉ có biểu tượng quay lại được hiển thị.

Đây là mã hoạt động của tôi

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

 }
}

Đây là tệp kiểu của tôi

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

Tệp bố cục

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

Ngăn điều hướng Hiển thị Nút Quay lại

Ngăn điều hướng Hiển thị Nút Quay lại

Trong cả hai trường hợp, chỉ có mũi tên quay lại được hiển thị, tôi đã đọc nhiều bài viết nhưng dường như không có gì tạo ra sự khác biệt. Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


148

Bạn cần gọi

mDrawerToggle.syncState();

2
Tôi đoán bên onDrawerClosed () và onDrawerOpened ()
Paul Verest

14
Ngay sau khi bạn khởi tạo của bạnActionBarDrawerToggle
Pedro Oliveira

1
Chào! Chúng ta có thể hiển thị biểu tượng Hamburger mà không cần gọi không mDrawerToggl.syncState(), thực sự thì tôi đang hiển thị Ngăn điều hướng dưới dạng lớp phủ trên Thanh công cụ nên hoạt ảnh không bắt buộc trong trường hợp của tôi.
Shajeel Afzal

1
Có thể vấn đề của bạn là một vấn đề khác @AlexVPerl. Không cần phải từ chối chỉ vì nó không phù hợp với bạn. Địa ngục, nếu tôi sẽ downvote tất cả các câu trả lời mà không làm việc cho tôi ....
Pedro Oliveira

1
@PedroOliveira Đó không phải là trường hợp sử dụng cho các nút biểu quyết lên / xuống sao?
AlexVPerl

19

Đảm bảo rằng bạn đang nhập chuyển đổi ngăn kéo chính xác.

Khi tôi nhập phiên bản v4, tôi có mũi tên (bên dưới).

import android.support.v4.app.ActionBarDrawerToggle;

Thay đổi nó thành này (bên dưới, v7) đã khắc phục sự cố của tôi.

import android.support.v7.app.ActionBarDrawerToggle;

14

Đảm bảo rằng bạn gọi

mDrawerToggle.syncState();

SAU KHI gọi

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

Có thể nào mà không đặt thanh công cụ làm thanh hành động, để hiển thị bánh hamburger có thể kéo được không?
nhà phát triển android

13

Khi sử dụng ActionBarDrawerToggle, bạn phải gọi nó trong onPostCreate () và 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);
    }

onOptionsItemSelectedcũng vậy.
Brais Gabin

Không giúp được gì cho tôi. Android 6.0
a_subscriber

9

Vì NavigationDrawer của tôi đang mở rộng Fragment không phải là Activity nên tôi không thể ghi đè postCreate. Dưới đây là những gì tôi đã làm.

   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

Hy vọng nó giúp!


Có thể mở rộng một chút về lý do tại sao bạn nghĩ điều này sẽ giúp ích cho người hỏi?
Mikael Ohlson

Xin lỗi, họ muốn biểu tượng bánh hamburger được hiển thị và cách tôi thay đổi nó bằng đoạn mã trên. Vui lòng đọc các bình luận bên cạnh mã. Điều này có thể giúp những người gặp khó khăn với biểu tượng quay lại trên ngăn điều hướng.
user2132226

Làm thế nào bạn có thể hiển thị bánh hamburger có thể kéo được trong thanh công cụ mà không làm cho thanh công cụ làm thanh hành động?
nhà phát triển Android

6

Đừng quên ghi đè phương thức onOptionsItemSelected và kiểm tra xem ctionBarDrawerToggle đã được nhấp chưa, trong trường hợp này trả về true nếu không hoạt động sẽ kết thúc.

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

3
Một lớp lót:return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
gregschlom

5

Bạn chỉ cần sử dụng cái này:

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

xóa mã sau mDrawerToggle.syncState () và bạn đã sẵn sàng.
Ahmad Jamil Al Rasyid,

3

Trong khi bao gồm ActionBarDrawerToggle, hãy đảm bảo sử dụng phương pháp đăng:

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

Điều này đã làm việc cho tôi! Điều đó và cũng loại bỏ một cách giải quyết được thực hiện bằng cách sử dụng setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)đó là buộc biểu tượng được giả vờ khi chuyển đổi giữa các phân đoạn. Nhưng sau khi được cập nhật lên biểu tượng bánh mì kẹp thịt động mới, điều đó không thực hiện được.
Jota

Nó thực sự hoạt động trên API 21
Ramptsdy Chintalapudi

3

mDrawerToggle.syncState() không hiệu quả với tôi, nhưng cuối cùng tôi đã làm cho nó hoạt động với:

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

Tuy nhiên, tôi không sử dụng Thanh công cụ.


Dòng mã này đã lưu lại ngày của tôi. Tôi đã chuyển đổi mã eclipse của mình thành studio android và đột nhiên nút bật tắt ngăn kéo của tôi tự động chuyển thành mũi tên. bây giờ nó đang hoạt động tốt sau khi thêm dòng mã này. Thanks a lot @ John Leehey
Hitesh Kamani

3

Tôi cũng gặp vấn đề tương tự, trong trường hợp của tôi, vấn đề là, khi khởi chạy actionbartoggle, tôi không chuyển đối số thanh công cụ hợp lệ (thanh công cụ được khởi tạo sau đó), nếu không có thanh công cụ thích hợp, không rỗng, ActionBarToggle sẽ không tạo được biểu tượng bánh hamburger.

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

1

bạn có thể gọi syncState () từ onPostCreate của Activity để đồng bộ hóa chỉ báo với trạng thái của DrawerLayout được liên kết sau khi onRestoreInstanceState đã xảy ra.

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

Ngoài ra ActionBarDrawerToggle có thể được sử dụng trực tiếp như một DrawerLayout.DrawerListener, hoặc nếu bạn đã cung cấp trình lắng nghe của riêng mình, hãy gọi qua từng phương thức lắng nghe từ chính bạn.

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

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

1

Ngăn điều hướng không hiển thị khi nhấp vào menu thanh tác vụ. CÁi này đã sửa nó giúp tôi.

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


        return super.onOptionsItemSelected(item);
    }

1

Điều này làm việc cho tôi. Tôi đã mở rộng AppCompatActivity thay vì 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();

    }
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.