2013-08-02 6 views
20

कल्पना कीजिए, मेरे पास FragmentA है जिसमें से मैं startDialogFragment (बॉक्स में EditText हैं)। मैं EditText से FragmentA से मूल्य वापस कैसे प्राप्त कर सकता हूं? मैं this, और this जैसे कुछ बनाने की कोशिश करता हूं लेकिन मैं सफल नहीं था।डायलॉग फ्रैगमेंट से डेटा को फ्रैगमेंट में कैसे प्राप्त करें?

+1

http://stackoverflow.com/questions/17966605/fragments-how-to-start-dialog-from-fragment/17968000#17968000। यहां बुलियन वैल्यू लौटने के बजाय एडिटेक्स्ट वैल्यू वापस कर दें। या एक इंटरफेस का उपयोग करें। – Raghunandan

+0

मैं इसे आजमाउंगा)) बहुत बहुत धन्यवाद –

उत्तर

65

Fragment.onActivityResult() विधि इस स्थिति में उपयोगी है। यह getTargetRequestCode() लेता है, जो एक कोड है जिसे आप टुकड़ों के बीच स्थापित करते हैं ताकि उन्हें पहचाना जा सके। इसके अलावा, यह एक अनुरोध कोड लेता है, सामान्य रूप से सिर्फ 0 अगर कोड अच्छी तरह से काम किया, और फिर एक Intent है, जो आप एक स्ट्रिंग भी संलग्न कर सकते हैं, तो

Intent intent = new Intent(); 
intent.putExtra("STRING_RESULT", str); 

भी तरह, setTargetFragment(Fragment, requestCode) टुकड़ा में इस्तेमाल किया जाना चाहिए कि इसका परिणाम पहचानने के लिए भेजा जा रहा है। वर्ग डेटा (DialogFragment) भेजने के लिए डेटा भेजने के लिए इस टुकड़ा हम सिर्फ परिभाषित का प्रयोग करेंगे

FragmentManager fm = getActivity().getSupportFragmentManager(); 
DialogFragment dialogFragment = new DialogFragment(); 
dialogFragment.setTargetFragment(this, REQUEST_CODE); 
dialogFragment.show(); 

:

private void sendResult(int REQUEST_CODE) { 
    Intent intent = new Intent(); 
    intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString); 
    getTargetFragment().onActivityResult(
     getTargetRequestCode(), REQUEST_CODE, intent); 
} 

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

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Make sure fragment codes match up 
    if (requestCode == DialogFragment.REQUEST_CODE) { 
     String editTextString = data.getStringExtra(
      DialogFragment.EDIT_TEXT_BUNDLE_KEY); 

, आप अपने EditText से स्ट्रिंग है पैरेंट खंड में DialogFragment से। अपने TextChangeListener() अज्ञात वर्ग में बस sendResult(int) विधि का उपयोग करें ताकि जब आपको इसकी आवश्यकता हो तो टेक्स्ट भेजा जाएगा।

+0

धन्यवाद, यह बहुत उपयोगी है –

+0

बहुत अच्छी व्याख्या। आपने मेरा दिन बचाया आपका बहुत बहुत धन्यवाद! – Kristopher

+0

हाय और इस समाधान के लिए धन्यवाद ... क्या आप कृपया मेरी मदद कर सकते हैं? क्यों मेरा onActivityResult() विधि मेरे संवाद खंड से परिणाम कैप्चर नहीं कर सकता है? जब मेरे पास एक ही कोड है ... अग्रिम धन्यवाद! –

2

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

public void datFromDialog(String data){ 
    MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag); 

    mf.iWantNewData(data); 
} 
+0

कृपया, क्या आप इसे और अधिक समझा सकते हैं या –

+0

अधिक पूर्ण एक्स्प्ले प्राप्त कर सकते हैं http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – tyczj

+0

मुझे इसकी आवश्यकता है बदले में गतिविधि के साथ संचार –

2

एक स्थिति है कि आप, सर्वर से कुछ फ़ाइल अपलोड कर रहे अपलोड बटन एक संवाद खोलने चाहिए की क्लिक पर मान लें, शीर्षक और वैकल्पिक tag.And संवाद के लिए उत्साह स्वयं 2 बटन युक्त कहते हैं कि रद्द करें और जारी रखें।

यूआई को लेआउट xml फ़ाइल का उपयोग करके अपनी इच्छानुसार बनाते हैं।

फिर डायलॉगफ्रेगमेंट को विस्तारित करने वाली एक कक्षा बनाएं। लेआउट को बढ़ाएं और देखें CreateView() विधि के अंदर विचारों को प्रारंभ करें।

उस वर्ग के अंदर एक इंटरफेस

public interface uploadDialogInterface 

    { 
     public void senddata(String title, String tag); 
    } 

    uploadDialogInterface interfaceObj; 
    String title=""; 
    String tag=" "; 

बना सकते हैं और महत्वपूर्ण बात यह है() विधि आप onAttach ओवरराइड करने के लिए की जरूरत है

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.context=context; 
    interfaceObj= (uploadDialogInterface) getTargetFragment(); 
} 

और बटन पर क्लिक

की तरह इंटरफ़ेस विधि कॉल में
 @Override 
public void onClick(View v) { 
    int id=v.getId(); 
    if(id== R.id.vB_fud_cancel) 
    { 
     dismiss(); 
    } 
    else if(id== R.id.vB_fud_upload) 
    { 
     title=mVideotitle.getText().toString(); 
     tag=mOptionaltag.getText().toString(); 
     if(mVideotitle.getText().toString().isEmpty()) { 
      Snackbar.make(mVideotitle,"Please enter the video title", Snackbar.LENGTH_SHORT).show(); 
     }else 
     { 
      interfaceObj.senddata(title,tag); 
      dismiss(); 

     } 
    } 
} 

और उस टुकड़े या गतिविधि के अंदर जिसमें आप संवाद लॉन्च कर रहे हैं setTargetFragment विशेषता शामिल है।

private void callUploadDialog() 
{ 
    UploadDialogFragment fragment = new UploadDialogFragment(); 
    fragment.setTargetFragment(this, 0); 
    FragmentManager manager = getFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_in); 
    fragment.show(ft, "UploadDialogFragment"); 
    fragment.setCancelable(false); 
} 

और अंत में आप इंटरफ़ेस को लागू करना चाहिए (कि संवाद टुकड़ा अंदर घोषित किया गया था) और ओवरराइड विधि

@Override 
public void senddata(String title,String optionaltag) { 
    this.videoTitle=title; 
    this.optionalTag=optionaltag; 

} 

मुझे लगता है कि इस पोस्ट के लिए जो लोग संवाद टुकड़ा का उपयोग कर रहे के लिए उपयोगी होगी पहली बार । मैं समाधान खोजने के लिए संघर्ष किया गया था। और उम्मीद है कि यह भविष्य में किसी की समस्या का समाधान करेगा। (भाषा के लिए खेद है)

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