2013-10-12 8 views
7

एक तरीका मुझे पता है कि गतिविधि के माध्यम से है। हम खंड से गतिविधि और गतिविधि को खंड में भेज सकते हैं क्या कोई अन्य तरीका है।मैं डेटा को एक टुकड़े से दूसरे खंड में कैसे स्थानांतरित कर सकता हूं एंड्रॉइड

+0

एक इंटरफ़ेस का उपयोग होस्टिंग गतिविधि के साथ संवाद एक तो गतिविधि – Raghunandan

+0

से टुकड़ा टी डेटा स्थानांतरित^नहीं, ऐसा नहीं है .. यह देख .. [http://stackoverflow.com/questions/13733304/ कॉलबैक-टू-ए-फ्रैगमेंट-टू-ए-डायलॉगफैगमेंट] (http://stackoverflow.com/questions/13733304/callback-to-a-fragment-from-a-dialogfragment) – Zyoo

+0

@Zyoo वह क्यों है ?? मेरे संपादन में – Raghunandan

उत्तर

4

डॉक्स

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

मैं तुम्हें डॉक्स में विधि का पालन करें और मैं नीचे दिए गए लिंक में प्रयास नहीं किया है किसी भी अन्य विकल्प

अधिक जानकारी और उदाहरण डॉक्स chekc लिए

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

+0

क्या होगा यदि मैं 'setRetainInstance (true)' का उपयोग कर रहा हूं? क्या इसे अभी भी गतिविधि को पास करने की आवश्यकता है? – Zyoo

+0

हां। दस्तावेज़ों की जांच करें http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) – Raghunandan

14

पास करने के लिए सुझाव है एक टुकड़े से दूसरे Bundle में डेटा मदद करेगा।

LifeShapeDetailsFragment fragment = new LifeShapeDetailsFragment(); // object of next fragment 
Bundle bundle = new Bundle(); 
bundle.putInt("position", id); 
fragment.setArguments(bundle); 

फिर push/call next Fragments.

और अगले टुकड़ा करने के लिए कोड:

Bundle bundle = this.getArguments(); 
int myInt = bundle.getInt("position", 0); 
+2

मूल एंड्रॉइड डेवलपर्स दस्तावेज़ के अनुसार, यह दृष्टिकोण गलत है। हमें दो टुकड़ों के बीच संवाद करने के लिए गतिविधि का उपयोग करना चाहिए। यहां लिंक है: http://developer.android.com/intl/vi/training/basics/fragments/communicating.html – salih

0

टुकड़े गतिविधियों का उपयोग कर के रूप में उनके बिचौलियों एक आम सबसे अच्छा अभ्यास है जब टुकड़े का उपयोग करके एक दूसरे के साथ संवाद करने के लिए अनुमति दे। इस महत्वपूर्ण पैटर्न पर अधिक जानकारी के लिए http://developer.android.com/guide/components/fragments.html पर जाएं। किसी भी समय आपको किसी अन्य टुकड़े के साथ बातचीत करने की आवश्यकता होती है, आपको हमेशा के बजाय टुकड़े की गतिविधि में एक विधि का उपयोग सीधे अन्य टुकड़े तक पहुंचाना चाहिए। एकमात्र समय एक दूसरे से एक टुकड़े तक पहुंचने के लिए समझ में आता है जब आप जानते हैं कि आपको किसी अन्य गतिविधि में अपने टुकड़े का पुन: उपयोग करने की आवश्यकता नहीं होगी। आपको हमेशा यह मानते हुए टुकड़े लिखना चाहिए कि आप उन्हें एक दूसरे के लिए हार्ड कोड के बजाय उनका पुन: उपयोग करेंगे।

4

मैं व्यवहार्य विचार करूँगा दो विधियों के होते हैं:

अपने मालिक गतिविधि और कि, स्वामित्व वाली गतिविधि के माध्यम से अन्य टुकड़े के लिए तत्पर संदेशों के साथ एक .Communicate, उस पर विवरण वह आधिकारिक एंड्रॉयड यहाँ प्रलेखन पूर्णांक पाया जा सकता है :

http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

उद्धरण:

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

संचार इंटरफेस कुछ इस तरह दिखाई दे सकता है:

public interface IActionListener{ 

    //You can also add parameters to pass along etc 
    public void doSomething(); 
} 

टुकड़ा कुछ इस तरह दिखेगा:

public class MyFragment extends Fragment{ 

private WeakReference<IActionListener> actionCallback; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      // This makes sure that the container activity has implemented 
      // the callback interface. If not, it throws an exception 
      actionCallback = new WeakReference<IActionListener>((IActionListener) activity); 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement IActionListener."); 
     } 
    } 
} 

मैं एक WeakReference यहाँ उपयोग कर रहा हूँ लेकिन वह वास्तव में आप पर निर्भर है। अब आप स्वामित्व गतिविधि के साथ संवाद करने के लिए actionCallback का उपयोग कर सकते हैं और IActionListener में परिभाषित विधियों को कॉल कर सकते हैं।

, स्वामित्व वाली गतिविधि इस प्रकार दिखाई देगा:

public class MyActivity extends ActionBarActivity implements IActionListener { 

public void doSomething(){ //Here you can forward information to other fragments } 

} 

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

सेटअप निम्नानुसार है: आपके पास दो टुकड़े (या अधिक) और एक गतिविधि (दूसरा खंड शुरू करने के लिए) है। हमारे पास एक इंटरफ़ेस है जो फ्रैगमेंट 2 को अपना कार्य पूरा करने के बाद फ्रैगमेंट 1 को प्रतिक्रिया देता है।

public class FragmentOne extends Fragment implements IActionListener { 

public void doSomething() {//The response from Fragment 2 will be processed here} 

} 

विधि ए टुकड़ा 1 में वर्णित पूछता है इसे करने के लिए गतिविधि के मालिक है का उपयोग करना: सरलता के लिए हम सिर्फ इंटरफेस मैं

यहाँ में परिभाषित का फिर से उपयोग हमारे टुकड़ा 1 है फ्रैगमेंट 2 शुरू करें। हालांकि, गतिविधि फ्रैगमेंट 1 के साथ फ्रैगमेंट 2 के लिए एक तर्क के रूप में गुजर जाएगी, इसलिए फ्रैगमेंट 2 बाद में अप्रत्यक्ष रूप से फ्रैगमेंट 1 तक पहुंच सकता है और उत्तर भेज सकता है। आइए देखें कि गतिविधि preps टुकड़ा 2 पर नजर डालते हैं:

public class MyActivity extends ActionBarActivity { 

    // The number is pretty random, we just need a request code to identify our request later 
    public final int REQUEST_CODE = 10; 
    //We use this to identify a fragment by tag 
    public final String FRAGMENT_TAG = "MyFragmentTag"; 

     @Override 
     public void onStartFragmentTwo() { 
      FragmentManager manager = getSupportFragmentManager(); 
      FragmentTransaction transaction = manager.beginTransaction(); 

        // The requesting fragment (you must have originally added Fragment 1 using 
        //this Tag !) 
      Fragment requester = manager.findFragmentByTag(FRAGMENT_TAG); 
        // Prepare the target fragment 
      Fragment target = new FragmentTwo(); 
        //Here we set the Fragment 1 as the target fragment of Fragment 2's  
        //communication endeavors 
      target.getSelf().setTargetFragment(requester, REQUEST_CODE); 

        // Hide the requesting fragment, so we can go fullscreen on the target 
      transaction.hide(requester); 
      transaction.add(R.id.fragment_container, target.getSelf(), FRAGMENT_TAG); 
      transaction.addToBackStack(null); 

      transaction.commit(); 
     } 
    } 

सुझाव: मैं समर्थन-फ्रेमवर्क का उपयोग कर रहा है, इसलिए यदि आप पूरी तरह से आप बस ActionBarActivity के बजाय FragmentActivity उपयोग कर सकते हैं के लिए> Android 3.0 का विकास।

अब FragmentTwo शुरू कर दिया जा रहा है, के कैसे FragmentTwo FragmentOne के साथ संवाद चाहते हैं पर ध्यान दें:

public class FragmentTwo extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     if(savedInstanceState != null){ 
      // Restore our target fragment that we previously saved in onSaveInstanceState 
      setTargetFragment(getActivity().getSupportFragmentManager().getFragment(savedInstanceState, TAG), 
        MyActivity.REQUEST_CODE);   
     } 

     return super.onCreateView(inflater, container, savedInstanceState); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     // Retain our callback fragment, the TAG is just a key by which we later access the fragment 
     getActivity().getSupportFragmentManager().putFragment(outState, TAG, getTargetFragment()); 
    } 

    public void onSave(){ 
     //This gets called, when the fragment has done all its work and is ready to send the reply to Fragment 1 
     IActionListener callback = (IActionListener) getTargetFragment(); 
     callback.doSomething(); 
    } 

} 

अब() DoSomething के कार्यान्वयन टुकड़ा 1 में बुलाया जाएगा।

+0

मुझे लगता है कि आपके पहले कोड अंश में कोड त्रुटि है। आप अपने वीक रेफरेंस "एक्शनलिस्टर" को एक बिंदु पर और "एक्शनकॉलबैक" पर कॉल करते हैं। क्या आप इसे जांच सकते हैं? –

+0

@ पार्थशाह ओह धन्यवाद! इसे मेरे सिर के ऊपर से लिखा और चर नामों को दोबारा जांचने में असफल रहा - धन्यवाद, मैंने इसे – AgentKnopf

+0

को सही किया है, फिर भी, जवाब बहुत अच्छे उदाहरणों के साथ उत्कृष्ट है! अच्छा काम! –

2

यहाँ, समाधान है नीचे दिए गए चरणों

का पालन करें:

1 इस इंटरफेस

for.e.g 
    public class OrderDetail extends ActionBarActivity implements TitleChangeListener 

3 का उपयोग कर अपने गतिविधि 2.implements कि

की तरह इंटरफ़ेस बनाने इस गतिविधि मेंUpdateTitle()

012 पर बना है
 public void onUpdateTitle(String title) 
     { 
     //here orderCompletedDetail is the object second fragment name ,In which fragement I want send data. 

     orderCompletedDetail.setTitle(title); 
     } 

4. अब, टुकड़े में एक कोड कुछ लिखें।

  public class OrderPendingDetail extends Fragment 
      { 
      private View rootView; 
      private Context context; 
      private OrderDetail orderDetail; 
      @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
      { 
      rootView = inflater.inflate(R.layout.order_pending_detail, container, false); 
      context = rootView.getContext(); 

      //here OrderDetail is the name of ActionBarActivity 
      orderDetail = (OrderDetail) context; 

     //here pass some text to second Fragment using button ClickListener 
      but_updateOrder.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) 
       { 
       // here call to Activity onUpdateTitle() 
       orderDetail.onUpdateTitle("bridal"); 
       } 
     }); 
     return rootView; 
     } 
     } 

5.Write दूसरा टुकड़ा setTitle में कुछ कोड()

  public void setTitle(String title) 
      { 
      TextView orderCompeted_name=(TextView)rootView.findViewById(R.id.textView_orderCompeted_name); 
      orderCompeted_name.setText(title); 
      //here you see the "bridal" value for TextView 
      } 

इस समाधान जब आप टुकड़ा है कि एक बार यह दूसरा टुकड़ा में मूल्य से पता चलता का बटन पर क्लिक करें। मुझे आशा है कि यह आपके लिए सहायक होगा .. !!

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

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