2012-12-19 14 views
8

घुमाए जाने पर बुलाया जाता है ICreateDialog() में DatePickerDialog को वापस करने के लिए मैं एक संवादप्रवाह का उपयोग कर रहा हूं। मैंने डेटसेटर को डायलॉगफ्रेगमेंट ("यह" नीचे उदाहरण में) सेट करने के लिए सेट किया है और सब कुछ काम करता है सिवाय इसके कि ऑनडेटसेट() को स्क्रीन रोटेशन होने पर कॉल किया जाता है, जो अवांछनीय है। जब स्क्रीन घुमाया जाता है तो मुझे डेटसेट को कॉल नहीं किया जा सकता है?DatePickerDialog onDateSet को

मेरे DialogFragment

public static class DateDialogFragment extends DialogFragment implements 
DatePickerDialog.OnDateSetListener{ 

    public static DateDialogFragment newInstance() { 
     return new DateDialogFragment(); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new DatePickerDialog(getActivity(), this, 2012, 11, 19); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, 
     int dayOfMonth) { 
     //This is called when screen rotated, which I dont want 
     Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); 
    } 

} 

और यह कैसे मैं इसे कहते

if(getActivity()!=null){ 
    FragmentManager fm = getActivity().getSupportFragmentManager(); 
    DialogFragment newFragment = DateDialogFragment.newInstance(); 
    newFragment.show(fm, "dialog"); 
} 
+0

में अपनी गतिविधि को यह संपत्ति जोड़ने [setRetainInstance()] (http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) – Dmide

+0

पर एक नज़र डालें मैं सही हूँ ? आप पर याद करने के लिए ** dateset ** विधि जब स्क्रीन –

+0

घुमाया इस प्रश्न पर एक इनाम पोस्टिंग के बाद से, मुझे पता चला है कि यह http://stackoverflow.com/questions/11444238/jelly-bean- का डुप्लिकेट है, नहीं करना चाहते datepickerdialog-a-way-to-cancel रद्द है लेकिन मैं अपने बक्षीस के कारण इसे बंद करने के लिए वोट नहीं दे सकता। –

उत्तर

-1

जब स्क्रीन गतिविधि को नष्ट कर दिया और निर्मित है घुमाया जाता है, यह एक नया टुकड़ा हर बार बनाता है । इस समस्या से बचने का एक तरीका आपके कोड में (ifActivity()! = Null) कथन के प्लेसमेंट को बदलना होगा। इसे कहीं भी रखें जो गतिविधि मनोरंजन से प्रभावित नहीं है (ऑनक्रेट विधि में नहीं)।

9

onDateSet विधि में, जाँच करें कि क्या ActivityActivity::isChangingConfigurations का उपयोग करके विन्यास परिवर्तन के कारण पुन: प्रारंभ करने जा रहा है। यदि हां, तो Toast प्रदर्शित न करें।

@Override 
public void onDateSet(android.widget.DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
    if(! this.getActivity().isChangingConfigurations()) { 
     // Dialog is dismissed by user explicitly, hence show the Toast message.  
     Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); 
    } 
} 

मैंने इसका परीक्षण किया है और पूरी तरह से काम करता है। अगर कोई और मदद की आवश्यकता है तो मुझे बताएं।

+1

यह केवल कॉन्फ़िगरेशन परिवर्तन में ही काम करेगा, लेकिन 'ऑनडेटेट' को तब भी कॉल किया जाएगा जब उपयोगकर्ता बैक कुंजी द्वारा 'डेटपिकरडियलॉग' को खारिज कर देगा। – Libin

3

आप संवाद के संलग्न/अलग कॉलबैक में ध्वज का उपयोग करने का प्रयास कर सकते हैं। विचार श्रोता के किसी भी ट्रिगरिंग को रद्द करना है, जबकि संवाद अभी तक खिड़की से जुड़ा हुआ नहीं है (इसलिए उपयोगकर्ता से परिवर्तन संभव नहीं हो सकता है) जो मुझे लगता है कि श्रोता को फिर से बुलाया जाने का कारण है):

// a field in the DateDialogFragment 
private boolean mShouldBeCanceled = true; // cancel the listener when this is true(the default) 

//... 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return new DatePickerDialog(getActivity(), this, 2012, 11, 19) { 

       @Override 
       public void onAttachedToWindow() { 
        mShouldBeCanceled = false; 
       } 

       @Override 
       public void onDetachedFromWindow() { 
        mShouldBeCanceled = true; 
       } 
    }; 
} 

और (श्रोता की वजह से श्रोता में ध्वज का उपयोग निर्माता में केवल प्रारंभ किया जा रहा):

@Override 
public void onDateSet(DatePicker view, int year, int monthOfYear, 
    int dayOfMonth) { 
    if (mShouldBeCanceled) { 
      return; // not a valid listener triggering 
    } 
    //This is called when screen rotated, which I dont want 
    Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); 
} 
1

कोशिश लाइन को बदलने के लिए

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new DatePickerDialog(getActivity(), this, 2012, 11, 19); 
    } 

से

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    super.onCreateDialog(savedInstanceState); 
} 
2

रास्ता DatePickerDialog कार्यान्वित किया जाता है कि यह onStop में DataSet बदलें सूचित करेंगे अगर OnDateSetListener पंजीकृत है।

तुम भी onDateSet जब वापस कुंजी जब DatePickerDialog, (न केवल ओरिएंटेशन)

कारण दिखाया गया है जब आप DatePickerDialog उदाहरण बनाया दबाया जाता है कहा जाता है देख सकते हैं, तो आप कॉलबैक श्रोता पंजीकृत किया है।

तो सबसे अच्छा तरीका है एक custom Dialog जो DatePickerDialog फैली बना सकते हैं और onStop

कस्टम DatePickerDialog

private static class CustomDatePickerDialog extends DatePickerDialog{ 

    public CustomDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) { 
     super(context, callBack, year, monthOfYear, dayOfMonth); 
    } 

    @Override 
    protected void onStop() { 
     return; 
    } 
} 

अंत में ओवरराइड करने के लिए है, CreateDialog

को
@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new CustomDatePickerDialog(getActivity(), this, 2012, 11, 19); 
    } 

यह चाहिए बदल पूरी तरह से काम करते हैं। यदि आपको कोई समस्या दिखाई देती है तो मुझे बताएं।

0

प्रकट

android:configChanges="keyboardHidden|orientation"