गतिविधि से फ्रैगमेंट में डेटा पास करें, जब फ्रैगमेंट के साथ तीव्रता से लोड किया गया हो

इसलिए मेरा मुद्दा मूल रूप से मेरी मेनऐक्टिविटी शुरू में एक फ्रैगमेंट से भरा हुआ है, जिसे हम MyFragment कहेंगे।

मैं JSON लोड कर रहा हूं, ऑनलाइन से और अपने MyFragment में पास होना चाहता हूं।

समस्या तब उत्पन्न हो रही है जब setContentView को MainActivity में कहा जाता है, यह MyFragment में onCreateView को बुला रहा है, जिसमें getArguments.getSerializable ("myTag" शामिल है। कुंजी पारित नहीं हुई है क्योंकि मैंने JSON अभी तक लोड नहीं किया है।

क्या आप मुझे इस मुद्दे को हल करने में मदद कर सकते हैं?

यहाँ मेरा कोड है:

मेरे MyFragment में:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        if(getArguments() != null) {
            coll = (HashSet) getArguments().getSerializable("myTag");
        }
   //Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_my, container, false);
}

मुख्यता (मान लें कि मैंने अपना JSON पहले ही लोड कर दिया है):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    loadJSON();
    passTagsToFragment(); //passes to the fragment
}

public void passTagsToFragment(){
    Bundle bundle = new Bundle();
    bundle.putSerializable("myTags", tagsSet);
    TagsFragment frag = new MyFragment();
    frag.setArguments(bundle);
}

संपादित करें:

मूल रूप से, मेरा मुद्दा यह है कि मैं फ्रेगमेंट को लोड करना शुरू करने से पहले पूरी तरह से मेनऐक्टिविटी लोड करना चाहता हूं। नहीं यकीन है कि कैसे करना है।

0
आप या तो JSON को सर्वर से खंड में लाने के लिए API को कॉल कर सकते हैं या जब तक JSON सर्वर से पुनर्प्राप्त नहीं किया जाता है और तब डेटा का उपयोग करके टुकड़ा लोड होता है।
जोड़ा लेखक Alvin Varghese, स्रोत
आप या तो JSON को सर्वर से खंड में लाने के लिए API को कॉल कर सकते हैं या जब तक JSON सर्वर से पुनर्प्राप्त नहीं किया जाता है और तब डेटा का उपयोग करके टुकड़ा लोड होता है।
जोड़ा लेखक Alvin Varghese, स्रोत
आप या तो JSON को सर्वर से खंड में लाने के लिए API को कॉल कर सकते हैं या जब तक JSON सर्वर से पुनर्प्राप्त नहीं किया जाता है और तब डेटा का उपयोग करके टुकड़ा लोड होता है।
जोड़ा लेखक Alvin Varghese, स्रोत
इसे onActivityCreated() विधि के अंदर कॉल करें
जोड़ा लेखक Sava Dimitrijević, स्रोत
@ SavaDimitrijević को वही त्रुटि मिली
जोड़ा लेखक Dave, स्रोत
@ SavaDimitrijević को वही त्रुटि मिली
जोड़ा लेखक Dave, स्रोत
@ SavaDimitrijević को वही त्रुटि मिली
जोड़ा लेखक Dave, स्रोत

6 उत्तर

loadJSON ऑनलाइन स्रोत से है, इसलिए मुझे लगता है कि यह एक AsyncTask है।

मैं आमतौर पर एक लाम्दा अभिव्यक्ति (कोटलिन) के रूप में करता हूं:

loadJSON({passTagsToFragment()})

लोडजोन को पैरामीटर के रूप में एक लैमडा अभिव्यक्ति लेनी चाहिए:

loadJSON(private val callback:()->Unit )

और AsyncTask :: onPostExecute में, आपको कॉलबैक कॉल करना चाहिए:

callback.invoke()

या केवल

callback()

तब आपने यह सुनिश्चित कर लिया था कि JSON लोड होने और टुकड़ा के पास जाने पर टुकड़ा खुल गया है।

ठीक है, मुझे इसे जावा में बनाने की कोशिश करें।

JSON को लोड करने वाले आपके AsyncTask में, आपको एक इंटरफ़ेस की आवश्यकता होगी, जैसे,

public interface JSONLoadCallback {
    void loaded();
}

और इसके निर्माता इंटरफ़ेस को पैरामीटर के रूप में लेते हैं:

class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}

और आपकी गतिविधि JSONLoadCallback लागू करती है:

@Override
public void loaded() {
    passTagsToFragment();
}

और खुद को AsyncTask में पास करना चाहिए:

JSONLoader(this).executeOnExecutor();

इस तरह, लोड किया गया() फ़ंक्शन JSON लोड समाप्त होने पर निकाल दिया जाता है।

आप देखते हैं, जावा कोड बहुत मौखिक हैं, कोटलिन ने जावा इंटरफ़ेस की आवश्यकता को लगभग हटा दिया है।

0
जोड़ा
धन्यवाद, हालांकि, आपके कोड को समझ में नहीं आता है। मैं AyncTask चला रहा हूं, क्या आप मेरे लिए इसे जावा में ट्रांसलेट कर सकते हैं।
जोड़ा लेखक Dave, स्रोत

loadJSON ऑनलाइन स्रोत से है, इसलिए मुझे लगता है कि यह एक AsyncTask है।

मैं आमतौर पर एक लाम्दा अभिव्यक्ति (कोटलिन) के रूप में करता हूं:

loadJSON({passTagsToFragment()})

लोडजोन को पैरामीटर के रूप में एक लैमडा अभिव्यक्ति लेनी चाहिए:

loadJSON(private val callback:()->Unit )

और AsyncTask :: onPostExecute में, आपको कॉलबैक कॉल करना चाहिए:

callback.invoke()

या केवल

callback()

तब आपने यह सुनिश्चित कर लिया था कि JSON लोड होने और टुकड़ा के पास जाने पर टुकड़ा खुल गया है।

ठीक है, मुझे इसे जावा में बनाने की कोशिश करें।

JSON को लोड करने वाले आपके AsyncTask में, आपको एक इंटरफ़ेस की आवश्यकता होगी, जैसे,

public interface JSONLoadCallback {
    void loaded();
}

और इसके निर्माता इंटरफ़ेस को पैरामीटर के रूप में लेते हैं:

class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}

और आपकी गतिविधि JSONLoadCallback लागू करती है:

@Override
public void loaded() {
    passTagsToFragment();
}

और खुद को AsyncTask में पास करना चाहिए:

JSONLoader(this).executeOnExecutor();

इस तरह, लोड किया गया() फ़ंक्शन JSON लोड समाप्त होने पर निकाल दिया जाता है।

आप देखते हैं, जावा कोड बहुत मौखिक हैं, कोटलिन ने जावा इंटरफ़ेस की आवश्यकता को लगभग हटा दिया है।

0
जोड़ा
धन्यवाद, हालांकि, आपके कोड को समझ में नहीं आता है। मैं AyncTask चला रहा हूं, क्या आप मेरे लिए इसे जावा में ट्रांसलेट कर सकते हैं।
जोड़ा लेखक Dave, स्रोत

loadJSON ऑनलाइन स्रोत से है, इसलिए मुझे लगता है कि यह एक AsyncTask है।

मैं आमतौर पर एक लाम्दा अभिव्यक्ति (कोटलिन) के रूप में करता हूं:

loadJSON({passTagsToFragment()})

लोडजोन को पैरामीटर के रूप में एक लैमडा अभिव्यक्ति लेनी चाहिए:

loadJSON(private val callback:()->Unit )

और AsyncTask :: onPostExecute में, आपको कॉलबैक कॉल करना चाहिए:

callback.invoke()

या केवल

callback()

तब आपने यह सुनिश्चित कर लिया था कि JSON लोड होने और टुकड़ा के पास जाने पर टुकड़ा खुल गया है।

ठीक है, मुझे इसे जावा में बनाने की कोशिश करें।

JSON को लोड करने वाले आपके AsyncTask में, आपको एक इंटरफ़ेस की आवश्यकता होगी, जैसे,

public interface JSONLoadCallback {
    void loaded();
}

और इसके निर्माता इंटरफ़ेस को पैरामीटर के रूप में लेते हैं:

class JSONLoader : AsyncTask<....> {
    JSONLoader(JSONLoadCallback callback) {
        _callback = callback;
    }
    @Override
    public void onPostExecute() {
        _callback.loaded();
    }
}

और आपकी गतिविधि JSONLoadCallback लागू करती है:

@Override
public void loaded() {
    passTagsToFragment();
}

और खुद को AsyncTask में पास करना चाहिए:

JSONLoader(this).executeOnExecutor();

इस तरह, लोड किया गया() फ़ंक्शन JSON लोड समाप्त होने पर निकाल दिया जाता है।

आप देखते हैं, जावा कोड बहुत मौखिक हैं, कोटलिन ने जावा इंटरफ़ेस की आवश्यकता को लगभग हटा दिया है।

0
जोड़ा
धन्यवाद, हालांकि, आपके कोड को समझ में नहीं आता है। मैं AyncTask चला रहा हूं, क्या आप मेरे लिए इसे जावा में ट्रांसलेट कर सकते हैं।
जोड़ा लेखक Dave, स्रोत

जब आपके सभी डेटा को लोड किया जाता है, तो आपको अपने asynctask के पोस्ट एग्जीक्यूट मेथड में अपने पासटैगसटैगमेंट() विधि को कॉल करना चाहिए।

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
जोड़ा
क्या आप कृपया गतिविधि_main.xml और इसके जावा वर्ग का कोड साझा कर सकते हैं
जोड़ा लेखक Diwakar Singh, स्रोत
वही त्रुटि। अपने xml में, मैंने एक खंड दृश्य जोड़ा है। इसलिए जब मैं पहली बार अपना आवेदन शुरू करता हूं तो यह MainActivity.java से पहले Fragment.java लोड करता है। शायद इससे स्पष्ट बातें सामने आएंगी।
जोड़ा लेखक Dave, स्रोत

जब आपके सभी डेटा को लोड किया जाता है, तो आपको अपने asynctask के पोस्ट एग्जीक्यूट मेथड में अपने पासटैगसटैगमेंट() विधि को कॉल करना चाहिए।

 protected void onPostExecute(Long result) {
     passTagsToFragment();
 }
0
जोड़ा
क्या आप कृपया गतिविधि_main.xml और इसके जावा वर्ग का कोड साझा कर सकते हैं
जोड़ा लेखक Diwakar Singh, स्रोत
वही त्रुटि। अपने xml में, मैंने एक खंड दृश्य जोड़ा है। इसलिए जब मैं पहली बार अपना आवेदन शुरू करता हूं तो यह MainActivity.java से पहले Fragment.java लोड करता है। शायद इससे स्पष्ट बातें सामने आएंगी।
जोड़ा लेखक Dave, स्रोत

मेरी समझ के अनुसार, पहले। आप लोडजसन() विधि को खंड पर कॉल कर सकते हैं और तदनुसार डेटा का उपयोग कर सकते हैं, लेकिन यदि आपके पास कुछ विशिष्ट तर्क हैं, तो आप एसिंक्वास्क का उपयोग कर सकते हैं और प्रगति बार के साथ json पुनर्प्राप्ति पर आप किसी भी MyFragment कॉल को वापस सेट कर सकते हैं और उसके अनुसार अपने अद्यतन को अपडेट कर सकते हैं।

0
जोड़ा