एक्टिविटी से फ्रैगमेंट तक एक चर कैसे पास करें, और इसे वापस पारित करें?


135

मैं वर्तमान में एक एंड्रॉइड ऐप बना रहा हूं, और मैं गतिविधि और टुकड़े के बीच एक तारीख पास करना चाहता हूं। मेरी गतिविधि में एक बटन है, जो खंड खोलता है: DatePickerFragment।

अपनी गतिविधि में मैं एक तारीख दिखाता हूं, जिसे मैं टुकड़े के साथ संशोधित करना चाहता हूं। इसलिए मैं तारीख को डेटपिकर के पास भेजना चाहता हूं, और इसे वापस गतिविधि में भेजना चाहता हूं।

मैंने बहुत सारे समाधानों की कोशिश की है, लेकिन कोई भी काम नहीं कर रहा है। आसान तरीका एक तर्क पारित करेगा, लेकिन यह टुकड़ों के साथ नहीं किया जा सकता है।


मेरी समस्या बिल्कुल आपकी जैसी है। मुझे आश्चर्य है कि उदाहरण केवल तारीख बीनने वाले के "उपयोगकर्ता" के रूप में खुद को टुकड़ों के रूप में मानते हैं, न कि गतिविधि जिसने उन्हें शुरू किया।
क्लाउडियो

जवाबों:


213

किसी खंड को जानकारी देने के लिए , जब आप इसे बनाते हैं, तो आप इसे सेट कर देते हैं, और आप इस तर्क को बाद में अपने अंश के onCreate या onCreateView की विधि पर पुनः प्राप्त कर सकते हैं।

अपने टुकड़े के नएInstance फ़ंक्शन पर आप अपने द्वारा भेजे गए तर्कों को जोड़ते हैं:

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

फिर विधि पर टुकड़े के अंदर onCreateया onCreateViewआप इस तरह से तर्क को पुनः प्राप्त कर सकते हैं:

Bundle args = getArguments();
int index = args.getInt("index", 0);

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

प्रलेखन ट्यूटोरियल:

http://developer.android.com/training/basics/fragments/communicating.html


10
मुझे लगता है कि लोगों द्वारा बार-बार यह सवाल पूछने की बात यह है कि यह वास्तव में प्रलेखन में अच्छी तरह से समझाया नहीं गया है।
माइकल एलन हफ

1
मैं अभी भी इस उलझन में हूं कि किस विधि का उपयोग करना सबसे अच्छा है, आपका, या नीचे दिया गया उत्तर @Elenasys
Yoann Hercouet

आर्किटेक्चर घटकों (I / O '17) का उपयोग करके टुकड़ों के बीच डेटा साझा करने का एक नया तरीका है: developer.android.com/topic/lbooks/Healthecture/…
jpardogo

कैसे उन टुकड़ों के बारे में जो XML लेआउट के अंदर बनाए जाते हैं?
राल्फगैब

मैं अब स्टैटिक विधि का उपयोग नहीं करना चाहता।
अहमदुल्ला सैकत

89

से डेटा भेजा जा रहा है Activityएक के लिएFragment

गतिविधि:

Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();

टुकड़ा:

टुकड़े में मूल्य पढ़ना

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

लेकिन अगर आप फ्रैगमेंट से एक्टिविटी में वैल्यूज भेजना चाहते हैं, तो jpardogo का जवाब पढ़ें, आपको इंटरफेस की आवश्यकता होगी, अधिक जानकारी: अन्य फ्रैगमेंट के साथ संवाद करना


2
कस्टम ऑब्जेक्ट कैसे पास करें? मैंने इस्तेमाल किया Parcelableलेकिन उसने मुझे दे दियाclass cast exception
viper

यह समाधान मेरे लिए काम नहीं कर रहा है, यह नहीं पा सकता है कि लेनदेन को कहां से आयात किया जाए
thebeancounter

यदि आप अपनी गतिविधि में फ्रैगमेंट लोड करते हैं तो आप अपने लेनदेन में परिभाषित बंडल के माध्यम से मान भेज सकते हैं। समझाएं कि आपका परिदृश्य क्या है?
जॉर्जेसी

8

@ ρяσѕρєя के और टेरी के लिए धन्यवाद ... यह मुझे बहुत मदद करता है और पूरी तरह से काम करता है

गतिविधि से आप इरादे के साथ डेटा भेजते हैं:

Bundle bundle = new Bundle(); 
bundle.putString("edttext", "From Activity"); 
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

और Fragment onCreateView विधि में:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

संदर्भ: एंड्रॉयड में गतिविधि से टुकड़ा करने के लिए डेटा भेजें


7

लायब्रेरी EventBus का उपयोग करें उस घटना को पारित करने के लिए जिसमें आपका चर आगे-पीछे हो सकता है। यह एक अच्छा समाधान है क्योंकि यह आपकी गतिविधियों और टुकड़ों को शिथिल रखता है

https://github.com/greenrobot/EventBus


4
मैं यह नहीं कह सकता कि यह एक अच्छा समाधान नहीं है, लेकिन सावधानी का एक शब्द है। जबकि EventBus का उपयोग करना काफी आसान है, यहां इसका खतरा भी है। यदि आप बहुत अधिक सिग्नल जोड़ना शुरू करते हैं, तो शिथिल युग्मित प्रकृति वास्तव में यह ट्रैक करना मुश्किल बना सकती है कि कौन कॉलिंग कर रहा है कि कौन और कहाँ अलग-अलग ईवेंट होते हैं।
जोहान पॉल

2

सभी कोटलिन डेवलपर्स के लिए वहाँ:

अपने फ्रैगमेंट (= जब आप फ़ाइल के साथ एक रिक्त-फ़्रैगमेंट बनाते हैं -> नया -> फ़्रैगमेंट -> फ़्रैगमेंट - (ब्लैंक) के साथ डेटा भेजने के लिए एंड्रॉइड स्टूडियो द्वारा प्रस्तावित समाधान यहां दिया गया है और आप "फ़्रेग्मेंट फ़ैक्टरी विधियों को शामिल करें") की जाँच करें।

इसे अपने फ्रैगमेंट में रखें:

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.applyजब कोई वस्तु बनाई जाती है, या जब वे यहां आते हैं , तो डेटा सेट करने के लिए एक अच्छी चाल है :

निर्दिष्ट फ़ंक्शन [ब्लॉक] thisको उसके रिसीवर और रिटर्न thisवैल्यू के रूप में मान के साथ कॉल करता है ।

फिर आपकी गतिविधि या फ्रैगमेंट में:

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

और इस तरह के रूप में अपने टुकड़े में तर्क पढ़ें:

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

अपनी गतिविधि पर डेटा वापस भेजने के लिए , बस अपनी गतिविधि में एक फ़ंक्शन को परिभाषित करें और अपने फ्रेग्मेंट में निम्नलिखित कार्य करें:

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

कोटलिन के जादू का आनंद लें!


1

गतिविधि से डेटा भेजना XML द्वारा लिंक किए गए टुकड़े में

यदि आप किसी एक फ़ाइल जैसे कि फ़ाइल> नया> टुकड़ा> टुकड़ा (सूची) का उपयोग करके एंड्रॉइड स्टूडियो में एक टुकड़ा बनाते हैं, तो टुकड़ा XML के माध्यम से जुड़ा हुआ है। NewInstance मेथड को टुकड़ों में बनाया जाता है, लेकिन इसे कभी नहीं बुलाया जाता है ताकि तर्कों को पारित करने के लिए उपयोग नहीं किया जा सके।

गतिविधि में इसके बजाय onAttachFragment विधि को ओवरराइड करें

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

फिर अन्य उत्तरों के अनुसार अंश onCreate पद्धति में तर्क पढ़ें


0

आप बस एक बंडल के साथ अपने टुकड़े को तुरंत रोक सकते हैं:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.