11

मैं अपने ऐप में v7 एपकोपेट लाइब्रेरी से ActionBarDrawerToggle का उपयोग कर रहा हूं और मेनू-टू-एरो एनीमेशन के साथ कुछ परेशानीएं हैं। सामग्री डिज़ाइन दिशानिर्देशों के मुताबिक नेविगेशन ड्रॉवर को टूलबार ओवरलैप करना चाहिए और जैसा कि मैं समझता हूं, ड्रॉवर खोलते समय आइकन एनीमेशन का उपयोग नहीं किया जाना चाहिए।ActionBarDrawerToggle एनीमेशन

नेविगेशन ड्रॉवर खोलने/बंद करने पर डिफ़ॉल्ट रूप से एनीमेशन सक्षम क्यों किया जाता है और मैं इसे कैसे अक्षम कर सकता हूं?

इसके अलावा, मैं अन्य अवसरों पर एनीमेशन कैसे ट्रिगर कर सकता हूं? मुझे this solution मिला लेकिन यह केवल एंड्रॉइड एपीआई 11+ के लिए काम करता है और इसे setDrawerIndicatorEnabled(false) पर कॉल करके या टूलबार में विस्तारित एक्शन व्यू द्वारा ओवरराइट किया गया है।

उत्तर

16

जब आप अपने ActionBarDrawerToggle बनाने के लिए, एनीमेशन/तीर निष्क्रिय करने के लिए और हमेशा एक हैमबर्गर दिखाने के इस तरह यह कार्य करें:

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, 
      getToolbar(), R.string.open, R.string.close) { 

     @Override 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
     } 

     @Override 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state 
     } 

     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, 0); // this disables the animation 
     } 
    }; 
+0

असल में, आपको केवल 'ऑन ड्रावर *()' विधियों को बिना 'सुपर' विधियों के कॉल किए बिना ओवरराइड करना होगा। अतिरिक्त 'super.onDrawerSlide (drawerView, 0);' कॉल के लिए कोई ज़रूरत नहीं है। यदि आप किसी और चीज के लिए ओवरराइड का उपयोग नहीं कर रहे हैं, हालांकि - यानी, अगर वे खाली होने जा रहे हैं - तो आप यहां एक अन्य उत्तर में उल्लिखित 'ड्रॉवर लिस्टर' के रूप में टॉगल सेट नहीं कर सकते हैं। –

1

ऊपर की तरह अपनी थीम में DrawerArrowStyle जोड़ें। यह चाल ...

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 

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

नमूना गतिविधि करता

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); 
    DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
     this, mDrawerLayout, mToolbar, 
     R.string.navigation_drawer_open, R.string.navigation_drawer_close 
    ); 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    mDrawerToggle.syncState(); 
} 
+0

वास्तव में क्या करना चाहिए कि परिवर्तन अक्षम? जब भी मैं इसे खोलता हूं तब भी मेरे पास एनीमेशन होता है और जब मैं इसे चाहता हूं तो उसे प्राप्त नहीं होता है। – Makru

+1

यदि आप इसे अक्षम करना चाहते हैं। इसे गलत <आइटम नाम = "स्पिनबार्स"> झूठी – AruLNadhaN

+0

पर सेट करें जो अभी भी बार कताई के बिना एनीमेशन दिखाता है। – Makru

1

मुझे पता है कि मैं बहुत देर हो चुकी हूं ...

गतिविधि में यह करें:

drawerToggle.setDrawerIndicatorEnabled(false); 

शैलियों.एक्सएमएल थीम में। यह करें:

<item name="android:homeAsUpIndicator">@drawable/menu_icon</item> 
4

मैं इस समस्या tooday भर में (मैं belive) एक उचित समाधान के लिए आया था और सरल पाया और:

बस अपने DrawerLayout के लिए DrawerListener रूप ActionBarDrawerToggle उदाहरण सेट न करें। इस तरह ActionBarDrawerToggle एनीमेशन नहीं करेगा जो ड्रॉवर स्लाइड ऑफसेट पर निर्भर करता है।

यदि आपको ड्रॉवरलेआउट के लिए श्रोता की आवश्यकता है DrawerLayout.DrawerListener का उपयोग करें।

संपादित करें: तुम भी एक श्रोता के रूप में ActionBarDrawerToggle सेट कर सकते हैं, लेकिन आप अपने onDrawerSlide विधि overide चाहिए की तुलना में। जैसे इस तरह:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open_desc, R.string.drawer_close_desc) { 
     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      super.onDrawerSlide(drawerView, 0); 
     } 
    }; 

slideOffset के बजाय 0 मूल्य के साथ super.onDrawerSlide() बुला, एनीमेशन

0
mDrawerToggle = new ActionBarDrawerToggle(
       this, 
       mDrawerLayout, 
       mToolbar, 
       R.string.drawer_open, 
       R.string.drawer_close 
     ) { 
      public void onDrawerClosed(View view) { 
       super.onDrawerClosed(view); 
       invalidateOptionsMenu(); 
       syncState(); 

      } 


      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       invalidateOptionsMenu(); 
       syncState(); 
       mLeftMenuFrame.bringToFront(); 
       mRightMenuFrame.bringToFront(); 

      } 
     }; 


     mDrawerToggle.setDrawerIndicatorEnabled(true); 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     mToolbar.inflateMenu(R.menu.menu_main); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     mDrawerToggle.syncState();