2013-11-15 14 views
14

करने की कोशिश कर रहा उदाहरण का उपयोग कर रहा नीचे दिए गए लिंकटुकड़ा पहले से ही सक्रिय - जब setArguments

http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html

में देना यहाँ मैं दो वर्गों एक सूची टुकड़ा और अन्य विस्तार टुकड़ा का विस्तार किया है। अब मैं इस तरह से detailfragment करने के लिए वस्तु गुजर रहा हूँ:

* ListFragment से *

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setArguments(bundle); 
     detailFragment.setUpLayout();// update the UI 
} 

अब टुकड़ा वर्ग मैं इसे प्राप्त है, बुनियादी लक्ष्य टुकड़ा के यूआई अद्यतन करने के लिए है सूची टुकड़ा में चयनित आइटम के आधार पर, thats कारण मैं वस्तु

Bundle b = getArguments(); 
b.getSerializable(BUNDLE_KEY); 

भेज रहा हूँ अब आइटम पर चयनित यह कहते हैं, "टुकड़ा पहले से ही सक्रिय" ।

यहां समस्या क्या है? मैं क्या गलत कर रहा हूं?

उत्तर

11
आधिकारिक Android विकास संदर्भ से

:

सार्वजनिक शून्य setArguments (बंडल args) इस टुकड़ा के लिए आपूर्ति निर्माण तर्क। इससे पहले कि इसकी गतिविधि से टुकड़ा जुड़ा हुआ हो, इसे केवल बुलाया जा सकता है; यानी, आपको टुकड़े के निर्माण के तुरंत बाद इसे कॉल करना चाहिए। यहां दिए गए तर्कों को खंड नष्ट करने और सृजन में बनाए रखा जाएगा।

आपका टुकड़ा पहले से ही मैं आप अपने खुद के विधि का उपयोग करने का सुझाव देते हैं अपनी गतिविधि से जुड़ा हुआ है, तो आप setArguments जरूरत नहीं है!

टुकड़ा वर्ग के भीतर अपने स्वयं के setUIArguments (बंडल args) बना सकते हैं और इस विधि के अंदर टुकड़ा यूआई अद्यतन

आप इस तरह से इस विधि कॉल करेगा:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     Bundle bundle = new Bundle(); 
     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setUIArguments(bundle); /* your new method */ 
} 

अपने टुकड़ा वर्ग में

public void setUIArguments(Bundle args) { 
    getActivity().runOnUiThread(new Runnable() { 
     public void run() { 
      /* do your UI stuffs */ 
     } 
    } 
} 
+0

इस वर्ग की तरह मेरी कक्षा विवरण फ्रेगमेंट फ्रैगमेंट एक्टिविटी बढ़ाती है और अंदर कि मेरे पास आंतरिक वर्ग है जो खंड को बढ़ाता है, अब मैं इस विधि को कैसे कॉल कर सकता हूं? – Goofy

+0

और मुझे विस्तार या इस विवरण की आवश्यकता है, क्या आप कृपया – Goofy

18

एक और समाधान आपके टुकड़े के लिए एक खाली कन्स्ट्रक्टर बनाना है। अपने setUpLayout() विधि में

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

    // Update the keys. 
    detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object 

    detailFragment.setUpLayout();// update the UI 
} 

अब आप getArguments कॉल कर सकते हैं() methond:

public Detailfragment() { 
    super(); 
    // Just to be an empty Bundle. You can use this later with getArguments().set... 
    setArguments(new Bundle()); 
} 

और onListItemClick विधि में आपको लगता है कि बंडल का उपयोग करें।

+0

के साथ मेरी मदद कर सकते हैं यह वास्तव में एक अच्छा विचार है और मैंने समाधान के लिए इसका उत्परिवर्तन किया। इसके अलावा, यह सही उत्तर के रूप में सेट किया जाना चाहिए, क्योंकि समाधान getArguments() और इसके हेरफेर के आसपास घूमता है - पहले जवाब के विपरीत जो एक वर्कअराउंड है जो सभी * परिदृश्यों में फिट नहीं होगा। – HBN

+1

मुझे '' 'टुकड़ा '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

0

यह एक वैश्विक चर:

private FragmentManager fragmentmanager; 
private FragmentTransaction fragmenttransaction; 

ये कोड अपने "सूची टुकड़ा" OnCreate() गतिविधि में डाल:

fragmenttransaction = fragmentmanager.beginTransaction(); 
fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); 
fragmenttransaction.addToBackStack(null); 
fragmenttransaction.commit(); 

ये है क्लिक Drawerlistitem घटना:

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 

    Bundle bundle = new Bundle(); 
    fragmenttransaction = fragmentmanager.beginTransaction(); 

     if(fragmentmanager.findFragmentById("test") != null) { 
      fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test")); 
     }  

    Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); 

     bundle.putSerializable(BUNDLE_KEY, obj);// passing this object 

     detailFragment.setArguments(bundle); 
     fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); 
     fragmenttransaction.addToBackStack(null); 
     fragmenttransaction.commit();  
} 

अब फ्रैगमेंट कोड को विस्तारित करना है:

Bundle b = getArguments(); 
b.getSerializable(BUNDLE_KEY); 
0

वार्ता टुकड़ा के सार्वजनिक विधि

public void setBundle(final Bundle bundle) { 
     final Bundle arguments = getArguments(); 
     arguments.clear(); 
     arguments.putAll(bundle); 
    } 

दिखाएँ या अद्यतन संवाद टुकड़ा

public void showMessageDialogue(final String tag, final Bundle bundle) { 
     final Fragment fragment = mFragmentManager.findFragmentByTag(tag); 
     if (fragment != null && fragment instanceof MessageDialogueFragment) { 
      ((MessageDialogueFragment) fragment).setBundle(bundle); 
     } else { 
      final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment(); 
      messageDialogueFragment.setArguments(bundle); 
      messageDialogueFragment.show(mFragmentManager, tag); 
     } 
    } 
9

आप देख सकते हैं वहाँ पहले से ही तर्क हैं, और यदि हां तो बस जोड़ने/उन्हें अपडेट करें।

private static void initFrag(Fragment frag, Bundle args) { 
    if (frag.getArguments() == null) { 
     frag.setArguments(args); 
    } else { 
     //Consider explicitly clearing arguments here 
     frag.getArguments().putAll(args); 
    } 
} 

वैकल्पिक रूप से, अगर आप सुरक्षित रूप से कल्पना नहीं कर सकते कि पहले से मौजूद तर्क अभी भी मान्य हैं मौजूदा बहस दूर स्पष्ट करने के लिए चाहते हो सकता है।

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