कैसे टुकड़े के बीच मूल्यों को पारित करने के लिए


109

मैं Fragments का उपयोग करने के लिए बहुत नया हूँ।

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

मैं पहले खंड से इसकी गतिविधि और फिर उस गतिविधि से दूसरी गतिविधि तक मूल्य भेजने में सक्षम था। अब मैं दूसरे खंड के अंदर इस मान का उपयोग कैसे करूं।

यहाँ जावा कोड :::

package com.example.fragmentexample;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Fragment_1 extends Fragment{

    OnFragmentChangedListener mCallback;

    // Container Activity must implement this interface
    public interface OnFragmentChangedListener {
        public void onButtonClicked(String name);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnFragmentChangedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub      

        View view = inflater.inflate(R.layout.fragment_fragment_1, container, false);

        final EditText edtxtPersonName_Fragment = (EditText) view.findViewById(R.id.edtxtPersonName);
        Button btnSayHi_Fragment = (Button) view.findViewById(R.id.btnSayHi);

        btnSayHi_Fragment.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String name = edtxtPersonName_Fragment.getText().toString();

                FragmentManager fm = getFragmentManager();
                Fragment_2 f2 = (Fragment_2) fm.findFragmentById(R.id.fragment_content_2);

                Activity activity = getActivity();

                if(activity != null)
                {
                    Toast.makeText(activity, "Say&ing Hi in Progress...", Toast.LENGTH_LONG).show();
                }


                if(f2 != null && f2.isInLayout())
                {
                    f2.setName(name);
                }
                else
                {
                    mCallback.onButtonClicked(name);
                }
            }
        });

        return view;


    }

}

MainActivity.Java

package com.example.fragmentexample;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;

import android.view.Choreographer.FrameCallback;
import android.view.Menu;

public class MainActivity extends Activity implements Fragment_1.OnFragmentChangedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public void onButtonClicked(String name) {
        // TODO Auto-generated method stub

        Intent i = new Intent(this, SecondActivity.class);
        i.putExtra("", name);
        startActivity(i);
    }

}

SecondActivity.Java

package com.example.fragmentexample;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_second);

        Bundle b = getIntent().getExtras();

        Fragment_2 f2 = new Fragment_2();
        f2.setArguments(b);
    }
}

Fragment_2.Java

package com.example.fragmentexample;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Fragment_2 extends Fragment{

    View view;
    TextView txtName;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        view = inflater.inflate(R.layout.fragment_fragment_2, container, false);

            // Exception at this line
        String name = getArguments().getString("message");
        txtName = (TextView) view.findViewById(R.id.txtViewResult);
        txtName.setText(name);

        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);       
    }

    public void setName(String name)
    {   
        txtName.setText("Hi " + name);
    }

}

मुझे निम्न अपवाद मिलते हैं :::

04-16 18:10:24.573: E/AndroidRuntime(713): FATAL EXCEPTION: main
04-16 18:10:24.573: E/AndroidRuntime(713): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.fragmentexample/com.example.fragmentexample.SecondActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.access$500(ActivityThread.java:122)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.os.Looper.loop(Looper.java:132)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.main(ActivityThread.java:4123)
04-16 18:10:24.573: E/AndroidRuntime(713):  at java.lang.reflect.Method.invokeNative(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713):  at java.lang.reflect.Method.invoke(Method.java:491)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-16 18:10:24.573: E/AndroidRuntime(713):  at dalvik.system.NativeStart.main(Native Method)
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:688)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:724)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.inflate(LayoutInflater.java:391)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.inflate(LayoutInflater.java:347)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:223)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Activity.setContentView(Activity.java:1786)
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.example.fragmentexample.SecondActivity.onCreate(SecondActivity.java:13)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Activity.performCreate(Activity.java:4397)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
04-16 18:10:24.573: E/AndroidRuntime(713):  ... 11 more
04-16 18:10:24.573: E/AndroidRuntime(713): Caused by: java.lang.NullPointerException
04-16 18:10:24.573: E/AndroidRuntime(713):  at com.example.fragmentexample.Fragment_2.onCreateView(Fragment_2.java:24)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:754)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:956)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1035)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.app.Activity.onCreateView(Activity.java:4177)
04-16 18:10:24.573: E/AndroidRuntime(713):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:664)
04-16 18:10:24.573: E/AndroidRuntime(713):  ... 21 more

मैं SecondActivity.java में बंडल से Fragment_2.Java तक का मूल्य कैसे प्राप्त करूं?


कृपया उस हिस्से को उजागर करें जहां समस्या हो रही है
निखिल अग्रवाल

आसान तरीका के साथ काम कर समाधान: stackoverflow.com/a/59332751/10201722
आदिल सिद्दीकी

जवाबों:


203

चरण 1। टुकड़े को गतिविधि से डेटा भेजने के लिए

Intent intent = new Intent(getActivity().getBaseContext(),
                        TargetActivity.class);
                intent.putExtra("message", message);
                getActivity().startActivity(intent);

चरण 2। गतिविधि में यह डेटा प्राप्त होता है:

Intent intent = getIntent();
String message = intent.getStringExtra("message");

चरण 3 । गतिविधि से डेटा भेजने के लिए सामान्य गतिविधि का अनुसरण करें

Intent intent = new Intent(MainActivity.this,
                        TargetActivity.class);
                intent.putExtra("message", message);
                startActivity(intent);

चरण 4 गतिविधि में इस डेटा को प्राप्त करने के लिए

     Intent intent = getIntent();
  String message = intent.getStringExtra("message");

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

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

और फ्रैगमेंट में टुकड़ा onCreateView विधि में प्राप्त करने के लिए:

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

    return inflater.inflate(R.layout.fragment, container, false);
    }

2
मैंने चरण 5 की कोशिश की, मैं टुकड़े से सूचीबद्धता को बुला रहा हूं और उस गतिविधि से आइटम का चयन करने के बाद, मैं चयनित फ़ाइल नाम के साथ टुकड़े में वापस आना चाहता हूं। लेकिन यह काम नहीं कर रहा है, इसकी वजह से मुझे Nullpointer Exception onCreateView पर दे रहा है। कृपया इस पर कोई समाधान? यह मेरा सवाल है stackoverflow.com/questions/18208771/…
ओंकारदाने

मैं यहां POJO कैसे डालूं? bundle.putString("message", "From Activity");
jeet.chanchawat

31
क्या किसी को इस बात से घृणा है कि इस तरह से कुछ करने के लिए उसे कैसे
एड ली

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

अंशों के बीच संवाद करने के लिए इंटरफेस का उपयोग करने के बारे में: developer.android.com/training/basics/fragments/…
आंद्रे एल टोरेस

49

जैसा कि डेवलपर साइट पर दिया गया है

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

संबंधित गतिविधि के माध्यम से टुकड़ों के बीच संचार किया जाना चाहिए।

निम्नलिखित घटक हैं:

एक गतिविधि टुकड़ों को होस्ट करती है और टुकड़े संचार की अनुमति देती है

FragmentA पहला टुकड़ा जो डेटा भेजेगा

FragmentB दूसरा टुकड़ा जो FragmentA से डेटा प्राप्त करेगा

FragmentA का कार्यान्वयन है:

public class FragmentA extends Fragment 
{
    DataPassListener mCallback;
    
    public interface DataPassListener{
        public void passData(String data);
    }

    @Override
    public void onAttach(Context context) 
    {
        super.onAttach(context);
        // This makes sure that the host activity has implemented the callback interface
        // If not, it throws an exception
        try 
        {
            mCallback = (OnImageClickListener) context;
        }
        catch (ClassCastException e) 
        {
            throw new ClassCastException(context.toString()+ " must implement OnImageClickListener");
        }
    }
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
    {
        // Suppose that when a button clicked second FragmentB will be inflated
        // some data on FragmentA will pass FragmentB
        // Button passDataButton = (Button).........
        
        passDataButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (view.getId() == R.id.passDataButton) {
                    mCallback.passData("Text to pass FragmentB");
                }
            }
        });
    }
}

मुख्य सक्रियता कार्यान्वयन है:

public class MainActivity extends ActionBarActivity implements DataPassListener{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (findViewById(R.id.container) != null) {
            if (savedInstanceState != null) {
                return;
            }
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new FragmentA()).commit();
        }
    }
    
    @Override
    public void passData(String data) {
        FragmentB fragmentB = new FragmentB ();
        Bundle args = new Bundle();
        args.putString(FragmentB.DATA_RECEIVE, data);
        fragmentB .setArguments(args);
        getFragmentManager().beginTransaction()
            .replace(R.id.container, fragmentB )
            .commit();
    }
}

FragmentB कार्यान्वयन है:

public class FragmentB extends Fragment{
    final static String DATA_RECEIVE = "data_receive";
    TextView showReceivedData;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_B, container, false);
        showReceivedData = (TextView) view.findViewById(R.id.showReceivedData);
    }
    
    @Override
    public void onStart() {
        super.onStart();
        Bundle args = getArguments();
        if (args != null) {
            showReceivedData.setText(args.getString(DATA_RECEIVE));
        }
    }
}

मुझे उम्मीद है कि इससे सहायता मिलेगी..


4
यहाँ OnImageClickListener क्या है? और यह कैसे एक DataPassListener चर के लिए डाली है?
हर्षा

मैंने पाया कि यह "DataPassListener" है। मुझे यह काम करने के लिए मिला, लेकिन हर बार बटन क्लिक करने के कारण खोजने के लिए डेटा भेजा जाता है। जब इसे भेजा जाता है तो यह टुकड़े को बदल देता है। जिसका अर्थ है कि सूची हर बार नवीनीकृत हो जाती है। इसलिए, वस्तुओं की सूची को स्मृति में नहीं रखना।
वेस्ले फ्रेंक

44

// Fragment_1.java में

Bundle bundle = new Bundle();
bundle.putString("key","abc"); // Put anything what you want

Fragment_2 fragment2 = new Fragment_2();
fragment2.setArguments(bundle);

getFragmentManager()
      .beginTransaction()
      .replace(R.id.content, fragment2)
      .commit();

// Fragment_2.java में

Bundle bundle = this.getArguments();

if(bundle != null){
     // handle your code here.
}

आशा है कि यह आपकी मदद करेगा।


1
मुख्य बिंदु दिखाने के लिए स्वच्छ उत्तर। putString(या putInt) का उपयोग कर जवाब है!
मेहदी देघानी

22

से डेवलपर्स वेबसाइट:

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

आप इसकी गतिविधि की मदद से टुकड़ों के बीच संवाद कर सकते हैं। आप इस दृष्टिकोण का उपयोग करके गतिविधि और टुकड़े के बीच संवाद कर सकते हैं ।

कृपया इस लिंक को भी देखें।


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

5

पहले सभी उत्तर सही हैं, आप उपयोग करके कस्टम ऑब्जेक्ट को छोड़कर डेटा पास कर सकते हैं Intent। आप कस्टम वस्तुओं पास करना चाहते हैं, तो आप को लागू करना Serialazableया Parcelableअपने कस्टम वस्तु वर्ग के लिए। मुझे लगा कि यह बहुत जटिल है ...

इसलिए यदि आपका प्रोजेक्ट सरल है, तो उपयोग करने का प्रयास करें DataCache। यह डेटा पास करने के लिए सुपर सरल तरीका प्रदान करता है। रेफरी: जीथब प्रोजेक्ट कैशेपॉट

1- इसे View या Activity या Fragment पर सेट करें जो डेटा भेजेगा

DataCache.getInstance().push(obj);

2- नीचे की तरह कहीं भी डेटा प्राप्त करें

public class MainFragment extends Fragment
{
    private YourObject obj;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        obj = DataCache.getInstance().pop(YourObject.class);

    }//end onCreate()
}//end class MainFragment

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

4

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

इस समाधान में, संचार में शामिल टुकड़े उसी व्यूमॉडल ऑब्जेक्ट को साझा करते हैं जो उनकी गतिविधि जीवनचक्र से बंधा होता है। दृश्य मॉडल ऑब्जेक्ट में liveata ऑब्जेक्ट होता है। एक टुकड़ा लाइवटाटा ऑब्जेक्ट पर पारित होने के लिए डेटा सेट करता है और दूसरा टुकड़ा ऑब्जर्वर लाइवटाटा बदलता है और डेटा प्राप्त करता है।

यहाँ पूरा उदाहरण है http://www.zoftino.com/passing-data-between-android-fragments-using-viewmodel


3

टुकड़ों के बीच तर्क पारित करना। इस प्रश्न का उत्तर देने में काफी देर हो चुकी है लेकिन यह किसी की मदद कर सकता है! Fragment_1.java

Bundle i = new Bundle(); 
            i.putString("name", "Emmanuel");

            Fragment_1 frag = new Fragment_1();
            frag.setArguments(i);
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.content_frame
                            , new Fragment_2())
                    .commit();

फिर अपने में Fragment_2.javaआप अपने onActivityCreated उदाहरण के भीतर सामान्य रूप से पैरामाटर्स प्राप्त कर सकते हैं

 Intent intent = getActivity().getIntent();
    if (intent.getExtras() != null) {
        String name =intent.getStringExtra("name");
    }

3

मुझे लगता है कि इस समस्या को हल करने का एक अच्छा तरीका कस्टम इंटरफ़ेस का उपयोग करना है।

कहते हैं कि आपके पास दो टुकड़े हैं (A और B) जो एक ही गतिविधि के अंदर हैं और आप A से B तक डेटा भेजना चाहते हैं।

इंटरफेस :

public interface OnDataSentListener{
    void onDataSent(Object data);
}

गतिविधि:

    public class MyActivity extends AppCompatActivity{

            private OnDataSentListener onDataSentListener;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_activity);

                FragmentTransaction trans = getFragmentManager().beginTransaction();

                FragmentA fa = new FragmentA();
                FragmentB fb = new FragmentB();

               fa.setOnDataSentListener(new Listeners.OnDataSentListener() {
                    @Override
                    public void onDataSent(Object data) {
                         if(onDataSentListener != null)  onDataSentListener.onDataSent(data);
                    }
               });

                transaction.add(R.id.frame_a, fa);
                transaction.add(R.id.frame_b, fb);

                transaction.commit();
            }

            public void setOnDataSentListener(OnDataSentListener listener){
                this.onDataSentListener = listener;
            }
        }

टुकड़ा एक:

public class FragmentA extends Fragment{

    private OnDataSentListener onDataSentListener;

    private void sendDataToFragmentB(Object data){
        if(onDataSentListener != null) onDataSentListener.onDataSent(data);
    }

    public void setOnDataSentListener(OnDataSentListener listener){
        this.onDataSentListener = listener;
    }
}

टुकड़ा बी:

public class FragmentB extends Fragment{

    private void initReceiver(){
        ((MyActivity) getActivity()).setOnDataSentListener(new OnDataSentListener() {
            @Override
            public void onDataSent(Object data) {
                //Here you receive the data from fragment A
            }
        });
    }
}

2

टुकड़ों के बीच संवाद काफी जटिल है (मुझे लगता है कि श्रोताओं की अवधारणा को लागू करने के लिए थोड़ा चुनौतीपूर्ण है)।

इन संचारों को अमूर्त करने के लिए 'इवेंट बस' का उपयोग करना आम बात है। यह एक 3 पार्टी लाइब्रेरी है जो आपके लिए इस संचार का ध्यान रखती है।

'ओटो' वह है जिसका उपयोग अक्सर ऐसा करने के लिए किया जाता है, और यह देखने लायक हो सकता है: http://square.github.io/otto/


2

फ्रैगमेंट से दूसरे फ्रैगमेंट में डेटा पास करना

  • पहले टुकड़े से

    // Set data to pass
    MyFragment fragment = new MyFragment(); //Your Fragment
    Bundle bundle = new Bundle();
    bundle.putInt("year", 2017)  // Key, value
    fragment.setArguments(bundle); 
    // Pass data to other Fragment
    getFragmentManager()
     .beginTransaction()
     .replace(R.id.content, fragment)
     .commit(); 
  • दूसरे टुकड़े पर

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
    
         Bundle bundle = this.getArguments();
         if (bundle != null) {
             Int receivedYear = bundle.getInt("year", ""); // Key, default value
         } 
    }

1

यह सरल कार्यान्वयन टुकड़ों के बीच डेटा को सरल तरीके से पारित करने में मदद करता है। लगता है कि आप 'Fract1' से 'Fragment2' तक डेटा पास करना चाहते हैं

Fragment1 में (भेजने के लिए डेटा सेट करें)

 Bundle bundle = new Bundle();
 bundle.putString("key","Jhon Doe"); // set your parameteres

 Fragment2 nextFragment = new Fragment2();
 nextFragment.setArguments(bundle);

 FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
 fragmentManager.beginTransaction().replace(R.id.content_drawer, nextFragment).commit();

Fragment2 onCreateView विधि (पैरामीटर प्राप्त करें) में

String value = this.getArguments().getString("key");//get your parameters
Toast.makeText(getActivity(), value+" ", Toast.LENGTH_LONG).show();//show data in tost

अपने ऐप में, मैं इस काम को प्राप्त करने की कोशिश कर रहा हूं, लेकिन किसी तरह हालांकि मूल्य पारित किया जा रहा है, यह खंड 2 पर प्रदर्शित नहीं हो रहा है, मुझे लगता है कि मैं R.id.content_drawer को सेट करने में गलती कर रहा हूं। क्या कोई मुझे निर्देशित कर सकता है कि .xml उदाहरण के साथ R.id.content_drawer के लिए सही पहचानकर्ता क्या हो सकता है।
बाज़

1

कोटलिन रास्ता

SharedViewModelआधिकारिक ViewModel प्रलेखन में एक प्रस्तावित का उपयोग करें

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

इस सामान्य दर्द बिंदु को ViewModel ऑब्जेक्ट्स का उपयोग करके संबोधित किया जा सकता है। ये टुकड़े इस संचार को संभालने के लिए अपने गतिविधि क्षेत्र का उपयोग करके एक ViewModel साझा कर सकते हैं

अपने व्यूमोडल को और अधिक आसानी से क्रिएट करने के लिए सबसे पहले फ्रैगमेंट-केटीएक्स को लागू करें

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.2.2"
} 

फिर, आपको केवल उस डेटा के अंदर रखने की जरूरत है, जिसे आप अन्य टुकड़े के साथ साझा कर रहे हैं

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

फिर, समाप्त करने के लिए, बस अपने विचार को हटाएं प्रत्येक टुकड़े में, और selectedउस टुकड़े से मान सेट करें जिसे आप डेटा सेट करना चाहते हैं

खुशबू ए

class MasterFragment : Fragment() {

    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
        model.select(item)
      }

    }
}

और फिर, बस इस मूल्य के लिए अपने Fragment गंतव्य पर सुनो

फ्रैगमेंट बी

 class DetailFragment : Fragment() {

        private val model: SharedViewModel by activityViewModels()

        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
                // Update the UI
            })
        }
    }

आप इसे विपरीत तरीके से भी कर सकते हैं


0

100% वर्किंग सॉल्यूशन: (अगर आप मदद करते हैं तो मारना मत भूलना)

अपने फर्स्ट फ्रैगमेंट में इस कोड को डालें:

    editprofile.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Fragment_editprofile Fragment = new Fragment_editprofile();
.
.
.
.
.


                Fragment.getintentdetails(tv_name.getText().toString(),
                            tv_mob.getText().toString(), tv_email.getText().toString(), tv_dob.getText().toString(),
                            tv_gender.getText().toString(), photointent);

                }
            });

दूसरे टुकड़े में, नीचे जैसा तरीका बनाएं:

public void getintentdetails(String name, String mobile, String email, String dob, String gender,
                                 String photointent) {

        this.name_str= name;
        this.mob_str= mobile;
        this.email_str= email;
        this.dob_str= dob;
        this.gender_str= gender;
        this.photo_str= photointent;

    }

तब वर्ग स्तर पर एक चर को परिभाषित करें:

String name_str, mob_str, dob_str, photo_str, email_str, gender_str;

फिर मान सेट करने के लिए दूसरे टुकड़े में एक और विधि बनाएं:

  setexistingdetails();


private void setexistingdetails() {

        if(!name_str.equalsIgnoreCase(""))
            (et_name).setText(name_str);
        if(!mob_str.equalsIgnoreCase(""))
            et_mobile.setText(mob_str);
        if(!email_str.equalsIgnoreCase(""))
            email_et.setText(email_str);
        if(!dob_str.equalsIgnoreCase(""))
            dob_et.setText(dob_str);
        if(!gender_str.equalsIgnoreCase("")){
            if (gender_str.equalsIgnoreCase("m")){
                male_radio.setChecked(true);
            }else {
                female_radio.setChecked(true);
            }
        }
        if(!photo_str.equalsIgnoreCase("")){
            try {
                Picasso.get().load(Const.BASE_PATH+"include/sub-domain/GENIUS/"+photo_str).into(adminpropic_edit);
            } catch (Exception e) {            }
        }
    }

0

आप ViewModel और लाइव डेटा द्वारा अपने लक्ष्य को प्राप्त कर सकते हैं जिसे अर्नव राव ने मंजूरी दे दी है । अब मैंने इसे बड़े करीने से साफ़ करने के लिए एक उदाहरण दिया।

पहले, मान लिया ViewModelगया नाम है SharedViewModel.java

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }
    public LiveData<Item> getSelected() {
        return selected;
    }
}

फिर स्रोत का टुकड़ा वह MasterFragment.javaहै जहां से हम एक डेटा भेजना चाहते हैं।

public class MasterFragment extends Fragment {
    private SharedViewModel model;

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {

            // Data is sent

            model.select(item);
        });
    }
}

और अंत में गंतव्य टुकड़ा वह DetailFragment.javaहै जहां हम डेटा प्राप्त करना चाहते हैं।

public class DetailFragment extends Fragment {

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        SharedViewModel model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
        model.getSelected().observe(getViewLifecycleOwner(), { item ->

           // Data is received 

        });
    }
}

0

ठीक है, यहाँ इतनी खुदाई के बाद मुझे एक सरल उपाय मिला, वास्तव में आपको कभी भी डेटा को खंड से खंडित नहीं करना चाहिए, यह हमेशा एक बुरा विचार है, आप खंड A से गतिविधि तक डेटा पास कर सकते हैं और खंड B में गतिविधि से डेटा प्राप्त कर सकते हैं।

For Example
//fragment A
//your method that will be called in Main Activity for getting data from this fragment
public List<customDataModel> getlist(){
return mlist; //your custom list 
}
buttonopen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //before calling  your new fragment, send a Broadcast signal to your main activity
 mContext.sendBroadcast(new Intent("call.myfragment.action"));
//here you are now changing the fragment
Fragment fragment1 = new VolunteerListDetailsFragment();

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment1);
            ft.commit();
        }
    });

// मुख्य गतिविधि में

this.registerReceiver(mBroadcastReceiver, new IntentFilter("call.myfragment.action"));//this line should be in your onCreate method
   BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
//init the fragment A
FragmenA fragment =
                (FragmentA) getSupportFragmentManager().findFragmentById(R.id.content_frame);
        mlistdetails = fragment.getlist();//this is my method in fragmentA which is retuning me a custom list, init this list type in top of on create fragment


    }
};
//here you are creating method that is returning the list that you just recieved From fragmentA
public List<customDataModel> getcustomlist(){
return mlistdetails; //you are returning the same list that you recived from fragmentA
}

// अब FragmentB में

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = (View) inflater.inflate(R.layout.vol_listdetails, container, false);

    mlistdetails=((MainActivity)getActivity()).getcustomlist();//here you are calling the method that you have created in Main Activity

    Toast.makeText(getActivity().getApplicationContext(), mlistdetails.get(0).getItemqty(), Toast.LENGTH_SHORT).show();
    return rootView;

}

-2

मैंने अपने जैसे भिखारियों के लिए वास्तव में कुछ आसान कर दिया है .. मैंने अपनी गतिविधि_मैं.एक्सएमएल और पुट में एक साक्षात्कार किया

id=index
visibility=invisible

तो मैं पहली टुकड़े से इस textview मिलता है

index= (Textview) getActivity().findviewbyid(R.id.index)
index.setText("fill me with the value")

और फिर दूसरे टुकड़े में मुझे मूल्य मिलता है

index= (Textview) getActivity().findviewbyid(R.id.index)
String get_the_value= index.getText().toString();

आशा करता हूँ की ये काम करेगा!


उत्तर प्रश्न से संबंधित नहीं है
कनागलिंगम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.