2013-07-27 22 views
26

मैंने ट्यूटोरियल Navigation Drawer का पालन किया है और सब कुछ एक छोटी सी गड़बड़ी को छोड़कर एक आकर्षण की तरह काम करता है। मैं जितना संभव हो उतना समझाऊंगा, और यदि यह अभी भी स्पष्ट नहीं है, तो मैं समस्या का एक वीडियो अपलोड करने का प्रयास करूंगा।कभी-कभी ड्रॉवररआउट कभी खुलने पर क्यों गड़बड़ करता है?

दराज खोलने की कोशिश करते समय समस्या होती है और केवल तब खुलती है, और केवल कभी-कभी होती है, हमेशा नहीं। यही वह समय है जब मैं इसे खोलना शुरू करता हूं, यह लगभग 4 मिलीमीटर खुले, और हमेशा एक ही दूरी के साथ glitches और फ्रीज। अगर मैं अपनी उंगली वापस ले जाता हूं, तो यह खुलता नहीं है और न ही वापस बंद रहता है, जब मैं जाने देता हूं, तो यह बंद हो जाता है।

कृपया ध्यान दें:

  • मैं कई उपकरणों (नेक्सस 7, नेक्सस) और आभासी उपकरणों पर यह कोशिश की है और साथ ही, समस्या बनी रहती है।
  • Issue replicated using the example provided by Google. (Youtube Link)
  • Issue presented with my app. (Youtube Link)
  • मैं एक बार लेकिन केवल Gmail एप्लिकेशन (जो मेरा मानना ​​है कि एक ही कार्यान्वयन उपयोग करता है) में एक बार इस मुद्दे को दोहराया, हालांकि बहुत कुछ मेरे ऐप और नमूना अनुप्रयोग के साथ बार-बार कामयाब रहे।
  • मैंने देखा कि गलती उसी दूरी पर होती है जब ड्रॉवर खुलता है यदि आप स्क्रीन के किनारे पर क्लिक करते हैं, क्योंकि इसमें प्रारंभिक खुले के बाद फ्रीज होता है और कभी नहीं गिरता है।

किसी भी पॉइंटर्स की सराहना की जाएगी।

+1

क्या आप स्क्रीनशॉट संलग्न कर सकते हैं, तो बस स्क्रॉलव्यू को मूल या मूल दृश्य के रूप में स्क्रॉलव्यू जोड़ें। – PravinCG

+0

क्या ऐसा होता है यदि आप सीमा से स्लाइड करके या आइकन दबाकर मेनू खोलते हैं (माना जाता है कि आपने इस सुविधा को लागू किया है) या दोनों मामलों में? क्या आपने किसी भी प्रकार के अपवादों के लिए लॉगकैट की जांच की है? मैंने कभी ऐसा कुछ नहीं देखा है और मैंने लगभग 10 डिवाइसों का परीक्षण किया है। आप समर्थन पुस्तकालय का कौन सा संस्करण उपयोग कर रहे हैं? ** पीएस **: क्या यह प्रभाव नमूना ऐप के साथ भी दिखाई देता है? (http://developer.android.com/training/implementing-navigation/nav-drawer.html देखें) – Trinimon

+0

@ ट्रिमिनॉन केवल स्लाइडिंग से होता है। Logcat कुछ भी प्रस्तुत नहीं करता है। पिछली समर्थन लाइब्रेरी का उपयोग कर रहा था, और हाल ही में जारी किया गया अपडेट किया गया था और यह अभी भी होता है (संस्करण 18)। यदि आप इसे देखना चाहते हैं तो मैंने मूल प्रश्न में एक वीडियो जोड़ा है। – LuckyMe

उत्तर

23

मैं DrawerLayout का कोड शोध किया और अगले अंक मिला: जब हम स्क्रीन के किनारे स्पर्श वहाँ प्रकट होता है drawer के छोटे (20 * घनत्व पिक्सल) भाग (यह दराज आसान चलती बनाता है)। यह तत्काल प्रकट नहीं होता है, लेकिन एक निश्चित अंतराल (160 एमएस) के बाद। यह postDelayed द्वारा महसूस किया जाता है।

drawer कई राज्यों में हो सकता है: IDLE, DRAGGING और SETTLING। यदि यह DRAGGING स्थिति में था, तो यह एक ही सूचक और किनारे के साथ इस स्थिति में वापस नहीं आ सकता है (क्योंकि एक शर्त है: mEdgeDragsInProgress[pointerId] & edge) == edge जो कि किनारे को खींचने की अनुमति नहीं देता है)।

तो कुछ मामलों में दराज देरी से पहले ही DRAGGING राज्य में स्थानांतरित हो गया है। यह देरी कार्रवाई 20 * घनत्व पीएक्स के लिए drawer खुलती है और drawer की स्थिति बदलती है। तो drawer अब और स्थानांतरित नहीं किया जा सकता है (क्योंकि यह राज्य DRAGGING पर वापस नहीं आ सकता है)।

देरी वाली कार्रवाई (जो ड्रॉवर खोलता है) को रद्द करने के लिए एक कोड है, लेकिन विधि onInterceptTouchEvent में यह कोड, जिसे केवल एक बार कहा जाता है (क्योंकि यह false देता है)। मुझे लगता है कि यह कोड onTouchEvent विधि में होना चाहिए।

दुर्भाग्यवश मुझे देरी हुई घटना को रद्द करने का कोई तरीका नहीं मिला (क्योंकि इसमें private संशोधक है और मैं इसे प्राप्त नहीं कर सकता)। तो सिर्फ एक ही रास्ता मैंने पाया: अपने प्रोजेक्ट के लिए DrawerLayout के स्रोत कोड को कॉपी करें और यह छोटा सा परिवर्तन करना: विधि onTouchEvent को विधि onInterceptTouchEvent से कॉपी

case MotionEvent.ACTION_MOVE: { 
      // If we cross the touch slop, don't perform the delayed peek for an edge touch. 
      if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { 
       mLeftCallback.removeCallbacks(); 
       mRightCallback.removeCallbacks(); 
      } 
      break; 
     } 

+0

ग्रेट रिसर्च, इसे अगले स्तर पर ले जाने के लिए प्रेरित करता है। बस एक अनुवर्ती, इसलिए 'देरीदार रुनबल जब निष्पादित किया गया तो राज्य 'सेटिंग' में बदल जाता है, फिर 'ड्रगिंग' या फिर 'ड्रगिंग' करने के लिए, लेकिन फिर यह गड़बड़ कर देता है क्योंकि राज्य को एक बार 'ड्रगिंग' से बदलकर 'ड्रगिंग' में बदल दिया जा रहा था ऐन? – LuckyMe

+1

जैसा कि मैं समझता हूं, राज्य 'ड्रगिंग' - 'दराज' उंगली का पालन करता है, राज्य 'सेटिंग' - 'दराज' निरंतर गति के साथ चलता है, उदा। जब हम इसे बीच में छोड़ देते हैं, तो यह बंद या खुला हो जाता है)। 'देरीदार रुनबल 'स्थिति को' सेटिंग 'में बदलती है (क्योंकि यह केवल एनीमेशन है,' दराज 'उंगली का पालन नहीं करता है)। – esentsov

+3

एक और कामकाज एंड्रॉइड का उपयोग कर रहा है: मुख्य सामग्री फ्रेमलेआउट में क्लिक करने योग्य = "सत्य"। http://stackoverflow.com/questions/18044277/android-navigation-drawer-bug-using-the- नमूना –

1

drawerlayout फ़ाइल में कोई त्रुटि नहीं है। बस content.xml (setcontentview फ़ाइल) फ़ाइल और टूल्स: संदर्भ = "। मुख्य सक्रियता"

+1

इस प्रश्न में पहले से ही एक उत्तर था जिसे स्वीकार किया गया था - अन्य उत्तरों को ध्यान में रखते हुए, आपको वास्तव में केवल देर से जवाब देना चाहिए जब आपको लगता है कि आपका उत्तर बहुत मूल्य जोड़ता है (उदाहरण के लिए सबसे हालिया उपयोगिताओं/पुस्तकालयों का उपयोग करके प्रश्न 3 साल पुराना है)। – ishmaelMakitla

+0

लेकिन मुझे नहीं लगता कि इस मुद्दे को हल किया गया है –

संबंधित मुद्दे

 संबंधित मुद्दे