8

मैं एक DialogDragment जो मैं दो तरीकों से दिखा सकते:DialogFragment onContextItemSelected से प्रदर्शित जीवित रहने नहीं करता onPause/onResume

1) अपने OnItemClickListener

2) से एक ListView आइटम पर दोहन को सक्रिय करके तक एक सूची दृश्य का संदर्भ मेनू और मेनू आइटम का चयन

# 1 करना सभी जीवन चक्र घटनाओं के तहत ठीक काम करता है, लेकिन अगर मैं इसे # 2 के माध्यम से आमंत्रित करता हूं और मैं गतिविधि को रोकता हूं (घर जाकर) और इसे कार्य स्विचर के माध्यम से फिर से शुरू करता हूं , संवाद अब प्रदर्शित नहीं किया गया है। टुकड़ा वहां है, और मैं डिवाइस को घुमा सकता हूं और संवाद दिखा सकता हूं।

मैंने प्रयोग किया, और यदि मैं कम से कम 1/2 सेकंड की देरी के साथ डायलॉगफ्रैगमेंट को हैंडलर में दिखाता हूं, तो यह काम करता है।

निम्नलिखित स्निपेट में विफल रहता है - यह संवाद से पता चलता है, लेकिन फिर रोकने/पुनः चलाने गुप्त रखता है:

public boolean onContextItemSelected(android.view.MenuItem item) { 
    boolean consumed = false; 

    switch (item.getItemId()) { 
    case R.id.menu_item: 
     showMyDialogFragment(); 
     consumed = true; 
     break; 
    } 

    return consumed; 
} 

तो निम्नलिखित स्निपेट काम करता है। रोकें/फिर से शुरू फिर से सही ढंग से संवाद प्रदर्शित:

public boolean onContextItemSelected(android.view.MenuItem item) { 
    boolean consumed = false; 

    switch (item.getItemId()) { 
    case R.id.menu_item: 
     new Handler().postDelayed(new Runnable() { 
      public void run() { 
       showMyDialogFragment(); 
      } 
     }, 300); 

     consumed = true; 
     break; 
    } 

    return consumed; 
} 

एक 0ms या 250ms देरी से 300 मि.से सेकंड की देरी की जगह का कारण बनता है इसे फिर से तोड़ा जा। यह दोहराया जा सकता है 100% समय।

यह एक भयानक हैक स्पष्ट रूप से, लगातार स्थिरता से बना है जो शायद डिवाइस की गति पर निर्भर करता है।

कोई भी जानता है कि यह क्यों चल रहा है और/या बेहतर समाधान प्रदान करता है? मैंने इस मुद्दे पर घंटों बिताए और यह सबसे अच्छा है जिसके साथ मैं आ सकता हूं।

+0

मुझे लगता है कि मेनू छुपा एनीमेशन के साथ ऐसा कुछ हो सकता है। यहां तक ​​कि पुराने, धीमे नेक्सस वन, 300 एमएमएस देरी काम कर रही है। –

+0

यदि आपको मौका मिलता है, तो एक पूर्ण नमूना प्रोजेक्ट पोस्ट करें जो इस घटना को प्रदर्शित करता है, क्योंकि मैं इसमें एक झलक लेना चाहता हूं। यदि यह वास्तव में एक प्लेटफॉर्म बग है, तो समस्या को ठीक करने में सहायता के लिए हमें उस परियोजना की वैसे भी आवश्यकता होगी। साथ ही, क्या यह मूल एपीआई स्तर 11 टुकड़े, या एंड्रॉइड सपोर्ट पैकेज का बैकपोर्ट का उपयोग कर रहा है?यदि उत्तरार्द्ध, क्या आप सुनिश्चित हैं कि आप Android समर्थन JAR के नवीनतम संस्करण पर हैं? – CommonsWare

+0

यहां समस्या का प्रदर्शन करने वाला नमूना प्रोजेक्ट है: https://github.com/androidmoney/Menu-DialogFragment-Test यह देशी और समर्थन खंड पैकेज दोनों पर होता है। समस्या दिखाने के लिए, संवाद या तो बटन या मेनू आइटम प्रदर्शित करें। फिर रोकें (घर पर जाएं) और फिर से शुरू करें (ऐप स्विचर का उपयोग करके पुन: ऐप करें)। –

उत्तर

2

मैं सभी विरामों पर संवाद को नष्ट करने और संवाद के बारे में बताए बिना रेस्यूम पर पुन: निर्माण करने की सिफारिश करता हूं। रोके जाने पर ओएस द्वारा ऐप की हत्या होने पर अन्यथा स्मृति रिसाव को जोखिम पहुंचाने के लिए।

अपने प्रश्न का स्पष्ट उत्तर देने के लिए, अपने ऐप स्थिति को बनाए रखने के लिए ओएस पर भरोसा न करें।

+0

ओएस संवाद स्थिति को ठीक से बनाए रखता है, उम्मीद है कि दृश्यता पहलू। अगर मैं स्क्रीन को बाद में घुमाता हूं, तो संवाद फिर से दिखाया जाता है। मैंने जेबी 4.2 में पीपुल ऐप में एक ही चीज़ का परीक्षण किया, और वही बात होती है। संवाद ऑन-ऑन/ऑनस्टोर पर गायब हो जाता है। यह स्पष्ट रूप से एक एंड्रॉइड बग है। –

+0

वास्तव में यह बहुत अच्छी तरह से एक एंड्रॉइड बग हो सकता है। मेरा विचार यह है कि आपको ओएस के लिए बनाए रखने वाले राज्य पर भरोसा नहीं करना चाहिए क्योंकि ओएस के अलग-अलग संस्करण में ऐसी "बग" उभर सकती हैं। यदि आप एक निश्चित परिणाम की अपेक्षा करना चाहते हैं, तो छोटी चीजें करें जैसे कि अपने राज्य का ट्रैक रखें। कई अप्रत्याशित चीजें फसल हो सकती हैं। यह सिर्फ अच्छा प्रोग्रामिंग है। –

+0

ठीक है, धन्यवाद। शायद यह एक अच्छी सलाह है, हालांकि फ्रैगमेंट्स का उपयोग करने के फायदों में से एक को हराया जाता है। –

4

मैं इसे एंड्रॉइड 4.2 (एआरएम एमुलेटर और गैलेक्सी नेक्सस) पर पुन: पेश कर सकता हूं। मैं आपके निष्कर्षों को x86 4.1 एमुलेटर, एक नेक्सस एस (4.1), और मोटोरोला RAZR i (4.0) पर पुन: उत्पन्न करने में असमर्थ हूं। मैं अपने स्वयं के पुस्तक नमूने में से एक को संशोधित करके समस्या को पुन: पेश कर सकता हूं। मैंने आपके नमूने का उपयोग करके इस पर एक मुद्दा दायर किया: http://code.google.com/p/android/issues/detail?id=41901 कृपया कोई अन्य जानकारी जोड़ें जो आपको लगता है कि समस्या का निदान करने में उनकी मदद करेगा।

एक कामकाज के संबंध में, यदि 300 एमएमएस काम करता है, तो हमारे पास उन सुंदर "समय के मुद्दों" में से एक है, और मुझे सबसे अच्छा विचार नहीं है कि आप इसके आसपास कैसे काम करेंगे, मेनू प्रदर्शित करने के लिए मेनू का उपयोग न करें यह। उदाहरण के लिए, अपने नमूना ऐप के साथ, बस SHOW_AS_ACTION_ALWAYS पर स्विचिंग (और इसलिए यह ओवरफ्लो मेनू की बजाय एक्शन बार पर एक आइटम है) DialogFragment ठीक से व्यवहार करने के लिए पर्याप्त है। उम्मीद है कि आपके पास इस यूआई को क्षतिपूर्ति करने के लिए अपने यूआई को एडजस्ट करने का एक तरीका होगा, या शायद कोई अन्य वर्कअराउंड पकाएगा और इसे यहां या इस मुद्दे पर पोस्ट करेगा।

+0

धन्यवाद। मेरे लिए, मेरे ऐप को फिर से डिजाइन करना असंभव होगा क्योंकि मैं संदर्भ और एक्शन बार ओवरफ्लो मेनू दोनों से संवाद पर इतना निर्भर हूं। –