Appcompatv7 - v21 नेविगेशन दराज हैमबर्गर आइकन नहीं दिखा रहा है


101

मैं नवीनतम appcompat समर्थन पुस्तकालय के साथ लॉलीपॉप शैली नेविगेशन दराज लागू कर रहा हूँ, लेकिन समस्या हैमबर्गर आइकन कभी प्रदर्शित नहीं होता है। केवल बैक आइकन दिखाया गया है।

यह मेरी गतिविधि कोड है

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

 }
}

यह मेरी स्टाइल फाइल है

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

लेआउट फ़ाइल

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

नेविगेशन ड्रॉअर बैक बटन दिखा रहा है

नेविगेशन ड्रॉअर बैक बटन दिखा रहा है

दोनों मामलों में केवल बैक एरो दिखाया गया है, मैंने कई पोस्ट पढ़ी हैं लेकिन कुछ भी फर्क नहीं पड़ता है। किसी भी सहायता की सराहना की जाएगी।

जवाबों:


148

आपको कॉल करने की आवश्यकता है

mDrawerToggle.syncState();

2
मुझे लगता है कि अंदर onDrawerClosed () और onDrawerOpened ()
पॉल वेरेस्ट

14
बस अपने इनिशियलाइज़ करने के बादActionBarDrawerToggle
पेड्रो ओलिवेरा

1
नमस्ते! क्या हम हैम्बर्गर आइकन को कॉल किए बिना दिखा सकते हैं mDrawerToggl.syncState(), वास्तव में मैं नेविगेशन ड्रावर को टूलबार पर ओवरले के रूप में दिखा रहा हूं, इसलिए मेरे मामले में एनीमेशन की आवश्यकता नहीं है।
शजील अफ़ज़ल

1
शायद आपकी समस्या एक और @AlexVPerl है। सिर्फ इसलिए काम नहीं करना चाहिए क्योंकि यह आपके काम नहीं आया। नरक, अगर मैं उन सभी उत्तरों को नकार दूंगा जो मेरे लिए काम नहीं करते हैं ....
पेड्रो ओलिवेरा

1
@PedroOliveira क्या वोट-अप / डाउन वोट बटन के लिए उपयोग-मामला नहीं है?
अलेक्सवीपर्ल

19

सुनिश्चित करें कि आप सही दराज टॉगल आयात कर रहे हैं।

जब मैंने v4 संस्करण आयात किया तो मेरे पास तीर (नीचे) था।

import android.support.v4.app.ActionBarDrawerToggle;

इसे इस (नीचे, v7) में बदलकर मेरा मुद्दा ठीक हो गया।

import android.support.v7.app.ActionBarDrawerToggle;

14

सुनिश्चित करें कि आप फोन करते हैं

mDrawerToggle.syncState();

कॉल करने के बाद

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

क्या यह संभव है कि टूलबार को एक्शनबार के रूप में स्थापित किए बिना, हैमबर्गर को दिखाने योग्य न बनाया जाए?
एंड्रॉइड डेवलपर

13

ActionBarDrawerToggle का उपयोग करते समय, आपको इसे onPostCreate () और 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);
    }

और onOptionsItemSelectedभी।
ब्रिस गाबिन

मेरे लिए मदद नहीं। Android 6.0
a_subscriber

9

जब से मेरा नेवीगेशनड्रैग एक अंश को बढ़ा रहा था एक गतिविधि नहीं मैं पोस्टक्रिएट को ओवरराइड करने में सक्षम नहीं था। नीचे मैंने जो किया है।

   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

आशा करता हूँ की ये काम करेगा!


शायद इस बारे में थोड़ा विस्तार करें कि आपको क्यों लगता है कि इससे पूछने वाले को मदद मिलेगी?
मिकेल ओहलसन

क्षमा करें कि वे हैमबर्गर आइकन प्रदर्शित करना चाहते थे और जिस तरह से मैंने इसे बदला वह उपरोक्त कोड के साथ था। कृपया कोड के साथ टिप्पणी पढ़ें। यह उन लोगों की मदद कर सकता है जो नेविगेशन ड्रावर पर बैक आइकन के साथ फंस गए हैं।
user2132226 14

बिना टूलबार को एक्शनबार बनाए बिना आप टूलबार में हैमबर्गर को कैसे दिखाएंगे?
एंड्रॉइड डेवलपर

6

मत भूल जाओ onOptionsItemSelected विधि को ओवरराइड करें और जांचें कि क्या ctionBarDrawerToggle पर क्लिक किया गया है, इस मामले में सही है अन्यथा गतिविधि समाप्त हो जाएगी।

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

3
वन-लाइनर:return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
gregschlom

5

आप बस इसका उपयोग कर सकते हैं:

// 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 () के बाद कोड निकालें , और आप जाने के लिए अच्छा है।
अहमद जमील अल रासीद

3

ActionBarDrawerToggle को शामिल करते समय, पोस्ट विधि का उपयोग करना सुनिश्चित करें:

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

यह मेरे लिए काम किया! वह और इसके द्वारा किए गए एक वर्कअराउंड को हटाकर, setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)उस आइकन को मजबूर करना था, जो टुकड़े के बीच स्विच करते समय दिखावा किया गया था। लेकिन नए एनिमेटेड बर्गर आइकन के अपडेट होने के बाद, यह काम नहीं करता है।
जोटा

3

mDrawerToggle.syncState() मेरे लिए काम नहीं किया, लेकिन मुझे अंततः इसके साथ काम करना पड़ा:

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

हालाँकि, मैं टूलबार का उपयोग नहीं कर रहा था।


कोड की इस लाइन ने मेरा दिन बचाया। मैंने अपने ग्रहण कोड को एंड्रॉइड स्टूडियो में बदल दिया है और अचानक मेरे ड्रॉअर टॉगल बटन को स्वचालित रूप से तीर में बदल दिया है। अब कोड की इस लाइन को जोड़ने के बाद यह ठीक काम कर रहा है। बहुत बहुत धन्यवाद @ जोहान लीही
हितेश कमानी

3

मुझे भी इसी तरह की समस्या मिली, मेरे मामले में समस्या यह थी कि जब एक्शनबार्टलॉग की शुरुआत हुई, तो मैं वैध टूलबार तर्क नहीं पास कर रहा था (टूलबार को बाद में आरंभीकृत किया गया था), एक उचित, गैर-अशक्त टूलबार के बिना, एक्शनबर्गल एक हैमबर्गर आइकन बनाने में विफल रहेगा।

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

1

आप onRestoreInstanceState होने के बाद लिंक्ड ड्रालेआउट की स्थिति के साथ संकेतक को सिंक्रनाइज़ करने के लिए अपनी गतिविधि के onPostCreate से SyncState () कॉल कर सकते हैं।

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

इसके अलावा ActionBarDrawerToggle का उपयोग सीधे एक DrawerLayout.DrawerListener के रूप में किया जा सकता है, या यदि आप पहले से ही अपने श्रोता प्रदान कर रहे हैं, तो अपने स्वयं के श्रोता तरीकों में से प्रत्येक को कॉल करें।

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

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

1

एक्शन बार मेनू पर क्लिक करने पर नेविगेशन ड्रॉअर नहीं दिख रहा था। इसने मेरे लिए इसे ठीक कर दिया।

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


        return super.onOptionsItemSelected(item);
    }

1

यह मेरे लिए काम करता है। मैंने ActionBarActivity के बजाय AppCompatActivity को बढ़ाया है।

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

    }
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.