2012-02-08 14 views
30

में सभी संवादों को कैसे खारिज करें मेरे पास एक ऐसी गतिविधि है जो रन-टाइम के दौरान अलग-अलग संवाद दिखा सकती है। मैं प्रत्येक संवाद बनाने के लिए क्रिएटडिअलॉग (इंट आईडी) पर उपयोग करता हूं और मैं शोडियलॉग (इंट आईडी) और dismissDialog (int id) विधि का उपयोग करता हूं और क्रमशः प्रत्येक संवाद को खारिज करता हूं।एंड्रॉइड - ऑन पॉज़

जब ऑनपॉज़() कहा जाता है, तो मुझे नहीं पता कि कौन सा संवाद (यदि कोई है) प्रदर्शित किया जा रहा है। मैं यह सुनिश्चित करना चाहता हूं कि जब ऑन पॉज़ कहा जाता है, तो सभी संवाद मंद हो जाते हैं। क्या सभी संवादों को खारिज करने का कोई अनुशंसित तरीका है? क्या मुझे प्रत्येक संवाद के लिए dismissDialog() को कॉल करना होगा?

+0

मैं नवीनीकृत किया है जवाब – quinestor

उत्तर

12

इस बात पर निर्भर करता है कि हम कितने संवाद के बारे में बात कर रहे हैं। संक्षिप्त उत्तर हाँ है, आपको प्रत्येक संवाद को खारिज करना होगा।

गतिविधि स्तर पर केवल कुछ संवाद घोषित करने के अलावा ऐसा करने के सुरुचिपूर्ण तरीके हो सकते हैं। एक बार घोषित होने के बाद आप सभी संवादों को हैश मैप में स्टोर कर सकते हैं और फिर सूची के माध्यम से फिर से चालू कर सकते हैं और प्रत्येक को रोक सकते हैं।

चूंकि आप नहीं जानते कि कौन से खुले हैं, आपको राज्यों को जांचना और ट्रैक करना होगा।

हालांकि, अगर आपके पास वास्तव में आपकी स्क्रीन पर कई सारे संवाद हैं तो आपको अपने यूआई/यूएक्स डिज़ाइन के साथ कुछ समस्याएं हो सकती हैं क्योंकि एंड्रॉइड आपको एक मॉडल देना चाहिए जो इसे खराब डिजाइन की तरह दिखने में आसान बनाता है।

+6

इसके अलावा, बंद संवाद ख़ारिज किए जाने से त्रुटियों से बचने के लिए, आप की कोशिश-पकड़ हर उपयोग कर सकते हैं जब आप एक संवाद को खारिज करते हैं। खुले संवाद की जांच करने से कोड के लिए यह बहुत आसान है। – Arci

7

DialogFragment कंटेनर का उपयोग पर एंड्रॉयड के हाल के जोर के साथ आप प्रत्येक

पर खारिज कॉल करने के लिए के बाद से संवाद एक टुकड़ा कंटेनर आप केवल अपने जीवन चक्र उपयोग कर सकते हैं होगा की जरूरत नहीं होंगे। इस DialogFragment पर विचार करें:

public class FragDialog extends DialogFragment{ 

    public ProgressDialog _dialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     if (savedInstanceState != null) { 
      //this.dismiss();  <-- The dialogs may be dismissed here 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) { 

     _dialog = new ProgressDialog(getActivity()); 
     return _dialog; 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     // <--------- You may overload onPause 
    } 
} 

कौन सा आप सामान्य रूप से एक fragmentmanager का उपयोग कर इसे इस तरह बुला अपनी गतिविधि में दिखाई देगा:

FragmentManager fm = getSupportFragmentManager(); 
FragDialog fragDialog = new FragDialog(); 
fragDialog.show(fm, "my_tag"); 

ध्यान दें कि आप वास्तव में बदल सकता है क्या DialogFragment onPause में करता है। जब आपकी गतिविधि चालू होती है, तो इस पर रोक भी कहा जाएगा।

इस.dismiss() का उपयोग कर रोकें() में संवाद को खारिज करना काम नहीं करेगा क्योंकि गतिविधि फिर से शुरू होने के बाद भी यह संवाद फिर से शुरू हो जाएगी। (मुझे लगता है कि ऐसा इसलिए है क्योंकि savestate ऑन पॉज़ से पहले संग्रहीत किया जाता है)।

लेकिन अगर आप कोड में दिखाए गए सहेजे गए इन्स्टेंसस्टेट (एक फिर से शुरू) का पता लगाते हैं तो आप सुरक्षित रूप से संवाद को खारिज कर सकते हैं।

+0

यह एक साफ समाधान है और अभी भी 2018 में काम कर रहा है, धन्यवाद! – Micer

12

आप DialogFragment उपयोग कर रहे हैं और आप सभी को बर्खास्त करने का उपयोग कर सकते हैं:

/** 
* Dismiss all DialogFragments added to given FragmentManager and child fragments 
*/ 
public static void dismissAllDialogs(FragmentManager manager) { 
    List<Fragment> fragments = manager.getFragments(); 

    if (fragments == null) 
     return; 

    for (Fragment fragment : fragments) { 
     if (fragment instanceof DialogFragment) { 
      DialogFragment dialogFragment = (DialogFragment) fragment; 
      dialogFragment.dismissAllowingStateLoss(); 
     } 

     FragmentManager childFragmentManager = fragment.getChildFragmentManager(); 
     if (childFragmentManager != null) 
      dismissAllDialogs(childFragmentManager); 
    } 
} 
+0

डायलॉगफ्रैगमेंट के लिए अभी तक सबसे साफ समाधान की तरह दिखता है। क्या आप इसे अपने उत्पादन ऐप्स में उपयोग कर रहे हैं? –

+0

@ grub- हाँ मैं करता हूं –

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