2012-06-26 20 views
79

डॉक्स Dialog वर्ग से dismiss() विधि के लिए यह कहते हैं:डायलॉग फ्रैगमेंट को सही तरीके से कैसे खारिज करें?

Dismiss this dialog, removing it from the screen. This method can be invoked 
safely from any thread. Note that you should not override this method to do 
cleanup when the dialog is dismissed, instead implement that in onStop(). 

मेरे कोड में, मैं क्या कॉल getDialog().dismiss() इसे खारिज किया जा सके। लेकिन मैं कुछ और नहीं कर रहा हूं या यहां तक ​​कि onStop() का उपयोग कर रहा हूं। तो मैं बिल्कुल पूछ रहा हूं कि DialogFragment किसी मेमोरी लीक से बचने के लिए सही ढंग से कैसे खारिज करना है ..

उत्तर

136

tl; डॉ: सही तरीका बंद करने के लिए एक DialogFragment DialogFragment पर सीधे dismiss()उपयोग करने के लिए है।


विवरण: documentation of DialogFragment राज्यों

संवाद का नियंत्रण (निर्णय लेने से पता चलता है जब करने के लिए, छुपाने के लिए, इसे खारिज) यहाँ एपीआई के माध्यम से किया जाना चाहिए, संवाद पर प्रत्यक्ष कॉल के साथ नहीं ।

इस प्रकार, आप getDialog().dismiss() उपयोग नहीं करना चाहिए, क्योंकि ऐसा करना संवाद पर dismiss()आह्वान करेंगे।

सार्वजनिक शून्य) को खारिज (

टुकड़ा और उसके डायलॉग को रद्द: इसके बजाय, आप DialogFragment ही की dismiss() विधि का उपयोग करना चाहिए। अगर टुकड़े को पीछे की ढेर में जोड़ा गया था, तो इस प्रविष्टि को लेकर सभी बैक स्टैक स्थिति पॉप हो जाएगी। अन्यथा, खंड को हटाने के लिए एक नया लेनदेन किया जाएगा।

जैसा कि आप देख सकते हैं, यह न केवल संवाद बंद करने पर बल्कि प्रक्रिया में शामिल खंड लेनदेन को संभालने का भी ख्याल रखता है।

आपको केवल onStop का उपयोग करने की आवश्यकता है यदि आपने स्पष्ट रूप से ऐसे संसाधन बनाए हैं जिन्हें मैन्युअल क्लीनअप (बंद करने वाली फ़ाइलें, कर्सर बंद करना आदि) की आवश्यकता होती है। फिर भी, मैं अंतर्निहित संवाद के onStop के बजाय डायलॉगफ्रैगमेंट के onStop को ओवरराइड कर दूंगा।

+4

दुर्भाग्य से यह मेरी युक्त गतिविधि को समाप्त करने का कारण बन रहा है ... –

+0

@ScootrNova: यह नहीं होना चाहिए, शायद आपके पास कहीं और एक बग है। आप टुकड़े कैसे बना रहे हैं? – Heinzi

+0

'संरक्षित शून्य शोडिअलॉगफ्रैगमेंट (अंतिम डायलॉग फ्रैगमेंट खंड) {अंतिम फ्रैगमेंट ट्रांस्सेक्शन fTransaction = getSupportFragmentManager()। StartTransaction(); fTransaction.addToBackStack (शून्य); fragment.show (fTransaction, "dialog");} ' गंदा एक लाइनर के लिए खेद है! लेकिन हाँ आप सही हो सकते हैं, इसलिए समय के लिए मैंने अपने संवाद प्रारूप को बंद करने का एक और तरीका लिखा है। जिस तरह से मैं उन्हें खारिज कर रहा था() विधि का उपयोग कर उन्हें खारिज कर रहा था, बस टैग द्वारा टुकड़ा ढूंढ रहा था और फिर उस पर खारिज() चला रहा था अगर यह शून्य नहीं था। ओह और हाँ, मैं उस विधि को पारित करने से पहले खंड को ठीक कर रहा हूं। –

0

आपको DialogonPause() में इसे खारिज कर देना चाहिए ताकि इसे ओवरराइड कर सकें।

भी खारिज आप null के लिए जाँच कर सकते हैं और नीचे की तरह दिख रहा है इससे पहले कि स्निपेट:

@Override 
protected void onPause() { 
    super.onPause(); 
    if (dialog != null && dialog.isShowing()) { 
     dialog.dismiss(); 
    } 
} 
+0

उसने पहले ही लिखा है कि वह अस्वीकार कर रहा है() और इसके बारे में डायलॉग फ्रैगमेंट। –

+0

मुझे लगता है कि यह संवाद और संवाद दोनों के लिए काम करता है @PareshMayani – Venky

+2

मेरा मानना ​​है कि @PareshMayani सही वेंकी है। Google द्वारा 'DialogFragment' पर ट्यूटोरियल' ऑन पॉज़() 'विधि का उपयोग नहीं किया जा रहा है। लेकिन मुझे लगता है कि मैं देख रहा हूं कि आप क्या कर रहे हैं। क्या बिंदु है हालांकि उपयोगकर्ता 'रोकें() 'पर कॉल नहीं कर रहा है। जब सिस्टम जानता है कि खंड को बुलाया जा रहा है। जब उपयोगकर्ता कहते हैं, तो क्या कहता है। उस मामले में इसे बंद करने का एक बेहतर तरीका क्या है? – Andy

48

मैं एक बेहतर तरीका एक DialogFragment बंद करने के लिए लगता है कि यह है:

Fragment prev = getSupportFragmentManager().findFragmentByTag("fragment_dialog"); 
    if (prev != null) { 
     DialogFragment df = (DialogFragment) prev; 
     df.dismiss(); 
    } 

इस तरह से आप न DialogFragment के लिए एक संदर्भ पकड़ करने के लिए है और हर जगह से इसे बंद कर सकते हैं।

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