53

मैंने डायलॉगफ्रैगमेंट का उपयोग शुरू किया, क्योंकि वे अभिविन्यास परिवर्तनों और सामानों के माध्यम से अच्छी तरह से काम कर रहे हैं। लेकिन मुझे सामना करने वाली ग़लत समस्या है।डायलॉगफ्रैगमेंट को खारिज करने का सही तरीका जब अनुप्रयोग पृष्ठभूमि में है

मेरे पास AsyncTask है जो प्रगति संवाद प्लग दिखाता है और onPostExecute को खारिज कर देता है। सबकुछ ठीक काम करता है, सिवाय इसके कि onPostExecute तब होता है जब एप्लिकेशन पृष्ठभूमि में होता है (उदाहरण के लिए होम बटन दबाकर)। तब मुझे यह त्रुटि डायलॉगफ्रैगमेंट पर खारिज कर दी गई - "Can not perform this action after onSaveInstanceState"। रवींद्र। नियमित संवाद ठीक काम करता है। लेकिन FragmentDialog नहीं।

तो मुझे आश्चर्य है, पृष्ठभूमि पृष्ठभूमि में डायलॉगफ्रैगमेंट को खारिज करने का सही तरीका क्या है? मैंने वास्तव में Fragments के साथ बहुत काम नहीं किया है, इसलिए मुझे लगता है कि मैं बस कुछ याद कर रहा हूँ।

+0

किसी रुके हुए का उपयोग कर अच्छा समाधान के लिए यह भी देखें [यहां] (http://stackoverflow.com/questions/7992496/how-to-handle-asynctask-onpostexecute-when-paused-to-avoid-illegalstateexception) हैंडलर – PJL

उत्तर

108

DialogFragment एक विधि dismissAllowingStateLoss()

+7

यह केवल तभी काम करता है जब आप इसका उपयोग करते हैं: ['शो (फ्रैगमेंट मैनेजर, टैग)'] (http://developer.android.com/reference/android/app/DialogFragment.html#show (android.app.FragmentManager,% 20java .lang.String)), लेकिन ['शो (FragmentTransaction, टैग)'] का उपयोग करते समय नहीं, (http://developer.android.com/reference/android/app/DialogFragment.html#show (android.app।FragmentTransaction,% 20java.lang.String)) क्योंकि 'dembackInternal' कॉल में 'popBackStack'' enqueueAction (..., allowStateLoss = false) 'भले ही हमने राज्य हानि की अनुमति देने के लिए कहा। और यह दोनों ढांचे और समर्थन संस्करणों में यह करता है। – TWiStErRob

+0

http://stackoverflow.com/a/10261449/1815624 – CrandellWS

0

एक समाधान जो काम कर सकता है आपके संवाद में Fragment.setRetainInstance(true) सेट कर रहा है, लेकिन यह फिक्सेस का सबसे सुंदर नहीं है।

कभी-कभी मैंने देखा है कि मुझे फ्रेमवर्क को पहले राज्य को बहाल करने के लिए अपने संवाद कार्यों को कतारबद्ध करना होगा। यदि आप वर्तमान लूपर (Activity.getMainLooper()) को पकड़ सकते हैं और उस हैंडलर में लपेटें तो आप उस कतार पर एक रननेबल पोस्ट करके कतार के पीछे अपनी बर्खास्तगी को पारित करने का प्रयास कर सकते हैं।

मैं अक्सर एक अलग टुकड़े का उपयोग कर समाप्त करता हूं जो retaininstance(true) है जिसमें ResultReceiver है। इसलिए मैं उस परिणाम रिसीवर को अपनी नौकरियों में भेजता हूं और कॉलबैक को अपने ऑनसीसीव (अक्सर अन्य रिसीवर के लिए राउटर के रूप में) में संभालता हूं। लेकिन अगर आप एसिंक कार्यों का उपयोग कर रहे हैं तो यह थोड़ा अधिक काम हो सकता है।

8

कहा जाता है यह है कि मैं क्या (df == dialogFragment) किया है:

यकीन है कि आप इस तरह से संवाद कॉल करें: आप संवाद कर dismis करना चाहते हैं

df.show(getFragmentManager(),"DialogFragment_FLAG"); 

यह चेक:

if(df.isResumed()){ 
    df.dismiss(); 
} 
return; 

करें कि आप अपने टुकड़ा की विधि onResume() में निम्नलिखित (DF नहीं)

@Override 
public void onResume(){ 
    Fragment f= getFragmentManager().findFragmentByTag("DialogFragment_FLAG"); 
    if (f!= null) { 
    DialogFragment df = (DialogFragment) f; 
    df.dismiss(); 
    getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
    super.onResume(); 
} 

इस तरह, संवाद खारिज कर दिया जाएगा अगर यह दिखाई दे रहा है .. दिखाई नहीं करता है, तो संवाद होने जा रहा है है कि बनाओ dismisded अगले टुकड़ा दिखाई दे (onResume) हो जाता है ...

+0

उपयोगकर्ता हमेशा वापस आने पर खंड को खारिज कर देता है, अगर उन्होंने अभी तक संवाद नहीं पढ़ा है, तो बस दिखाए जाने के बाद ही ऐप को छोड़ दिया जाए? – TWiStErRob

+0

अब मैं इस कोड द्वारा संवादफलक को प्रसारित कर सकता हूं –

3

यह मैं प्राप्त करने के लिए आप क्या चाहते हैं नहीं था क्या है: मैं एक टुकड़ा गतिविधि है जिस पर मैं fragment_RedemptionPayment नाम के एक संवाद टुकड़ा जो विश्व स्तर पर पर घोषित किया जाता है दिखा रहा था चोटी। निम्न कोड DialogFragment को खारिज कर देता है अगर यह गतिविधि पृष्ठभूमि में जाने से पहले दिखा रहा था और अग्रभूमि में वापस आता है।

 @Override 
     public void onResume() { 
      super.onResume();   
      if(fragment_RedemptionPayment.isVisible()){ 
       fragment_RedemptionPayment.dismiss(); 
      } 
} 
संबंधित मुद्दे