किसी अन्य Fragment में कुछ डेटा कैसे ट्रांसफर करें?


194

कैसे एक और करने के लिए कुछ डेटा स्थानांतरित करने के Fragmentवैसे ही यह साथ किया गया था extrasके लिए intents?


मैं यहाँ इस प्रश्न का उत्तर देने का प्रयास करता हूँ । मुझे आशा है कि टी काम करता है।
ozhanli

जवाबों:


482

एक का उपयोग करें Bundle। यहाँ एक उदाहरण है:

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

बंडल ने बहुत सारे डेटा प्रकारों के लिए विधियाँ रखी हैं। देखें इस

फिर अपने में Fragment, डेटा को पुनः प्राप्त करें (जैसे onCreate()विधि में):

Bundle bundle = this.getArguments();
if (bundle != null) {
        int myInt = bundle.getInt(key, defaultValue);
}

1
आपके जवाब के लिए हाय thanx लेकिन क्या हमें कुछ भी लागू करने की आवश्यकता है ??
अंकित श्रीवास्तव

नहीं, आपको किसी भी वर्ग को लागू करने की आवश्यकता नहीं है।
जीन

2
उस बंडल को देखने के लिए एक चेक जोड़ना चाह सकते हैं! = इससे पहले कि आप उसमें से कुछ भी निकालने का प्रयास करें?
नील्स

और अगर आपके पास स्मृति में एक मौजूदा टुकड़ा है?
पाउडर ३६६

यह कोड काम नहीं कर रहा है, डेटा के साथ टुकड़ा करने के लिए गतिविधि को पुनर्निर्देशित नहीं कर रहा है
वेंकटेश

44

पिछले उत्तर को और भी अधिक विस्तारित करने के लिए, जैसे कि अंकित कह रहा था, जटिल वस्तुओं के लिए आपको सीरियल को लागू करने की आवश्यकता है। उदाहरण के लिए, साधारण वस्तु के लिए:

public class MyClass implements Serializable {
    private static final long serialVersionUID = -2163051469151804394L;
    private int id;
    private String created;
}

आप में से:

Bundle args = new Bundle();
args.putSerializable(TAG_MY_CLASS, myClass);
Fragment toFragment = new ToFragment();
toFragment.setArguments(args);
getFragmentManager()
    .beginTransaction()
    .replace(R.id.body, toFragment, TAG_TO_FRAGMENT)
    .addToBackStack(TAG_TO_FRAGMENT).commit();

अपने प्रदर्शन में:

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

    Bundle args = getArguments();
    MyClass myClass = (MyClass) args
        .getSerializable(TAG_MY_CLASS);

आप सबसे अच्छे हैं। धन्यवाद
हैश

1
@ समेरा मैं आमतौर पर अपने खंड वर्ग के साथ एक स्ट्रिंग लगाता हूं, अर्थात यदि मेरे पास वर्ग MyFragmentIMGoingTo.java है तो मेरा TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik 16

बेहतर उपयोग Parcelable के रूप में google ने इसे Android ऑपरेटिंग सिस्टम के लिए अधिक अनुकूलित क्रमांकन तकनीक के रूप में अनुशंसित किया।
रत्न

16

getArguments () अशक्त लौट रहा है क्योंकि "इसका कुछ भी नहीं मिलता है"

इस स्थिति को संभालने के लिए इस कोड को आज़माएं

if(getArguments()!=null)
{
int myInt = getArguments().getInt(key, defaultValue);
}

आपके जवाब के लिए हाय thanx लेकिन क्या हमें कुछ भी लागू करने की आवश्यकता है ??
अंकित श्रीवास्तव

क्या आप सुनिश्चित हैं? क्योंकि मुझे तब खंडन / पार्सल लागू करना पड़ता था जब मैं इरादे का उपयोग करके एक खंड और एक गतिविधि के बीच जटिल डेटा पारित कर रहा था ......
अंकित श्रीवास्तव

मैंने केवल सरल मूल्यों के साथ प्रयास किया। Serializable या Parcelable माफ़ करने के बारे में कोई विचार नहीं
Sakthimuthiah

1
यह एक टिप्पणी का जवाब नहीं होना चाहिए !!
रत्न

14

टुकड़ा करने के लिए टुकड़ा का उपयोग कर डेटा पास करने का पूरा कोड

Fragment fragment = new Fragment(); // replace your custom fragment class 
Bundle bundle = new Bundle();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                bundle.putString("key","value"); // use as per your need
                fragment.setArguments(bundle);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.replace(viewID,fragment);
                fragmentTransaction.commit();

कस्टम टुकड़ा वर्ग में

Bundle mBundle = new Bundle();
mBundle = getArguments();
mBundle.getString(key);  // key must be same which was given in first fragment

कहाँ से देखें
हू

@ हू: कृपया अपना प्रश्न निर्दिष्ट करें कि आप क्या पूछना चाहते हैं
आनंद सजीवनी '

क्या आप मेरी मदद कर सकते हैं? stackoverflow.com/questions/32983033/…
हू

5

बस पिछले उत्तरों को बढ़ाने के लिए - यह किसी की मदद कर सकता है। यदि आपका getArguments()रिटर्न null, इसे onCreate()विधि में रखें और अपने टुकड़े का निर्माण न करें:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int index = getArguments().getInt("index");
}

1
            First Fragment Sending String To Next Fragment
            public class MainActivity extends AppCompatActivity {
                    private Button Add;
                    private EditText edt;
                    FragmentManager fragmentManager;
                    FragClass1 fragClass1;


                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        Add= (Button) findViewById(R.id.BtnNext);
                        edt= (EditText) findViewById(R.id.editText);

                        Add.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                fragClass1=new FragClass1();
                                Bundle bundle=new Bundle();

                                fragmentManager=getSupportFragmentManager();
                                fragClass1.setArguments(bundle);
                                bundle.putString("hello",edt.getText().toString());
                                FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
                                fragmentTransaction.add(R.id.activity_main,fragClass1,"");
                                fragmentTransaction.addToBackStack(null);
                                fragmentTransaction.commit();

                            }
                        });
                    }
                }
         Next Fragment to fetch the string.
            public class FragClass1 extends Fragment {
                  EditText showFrag1;


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

                        View view=inflater.inflate(R.layout.lay_frag1,null);
                        showFrag1= (EditText) view.findViewById(R.id.edtText);
                        Bundle bundle=getArguments();
                        String a=getArguments().getString("hello");//Use This or The Below Commented Code
                        showFrag1.setText(a);
                        //showFrag1.setText(String.valueOf(bundle.getString("hello")));
                        return view;
                    }
                }
    I used Frame Layout easy to use.
    Don't Forget to Add Background color or else fragment will overlap.
This is for First Fragment.
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:background="@color/colorPrimary"
        tools:context="com.example.sumedh.fragmentpractice1.MainActivity">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/editText" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:id="@+id/BtnNext"/>
    </FrameLayout>


Xml for Next Fragment.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
   android:background="@color/colorAccent"
    android:layout_height="match_parent">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edtText"/>

</LinearLayout>

3
अपना जवाब समझाएं? किसी भी स्पष्टीकरण के बिना कोड बहुत मदद नहीं करेगा
कोडर

मैंने एक प्रवाह में कोड लिखा है, इसलिए इसे समझा जा सकता है ..... बंडल के उपयोग के साथ मुख्य गतिविधि फ्रैगक्लास 1 तक डेटा पास करना।
सुमेध उल्हे

1

गतिविधि वर्ग से:

टुकड़ा करने के लिए बंडल तर्क का उपयोग कर डेटा भेजें और टुकड़ा लोड

   Fragment fragment = new myFragment();
   Bundle bundle = new Bundle();
   bundle.putString("pName", personName);
   bundle.putString("pEmail", personEmail);
   bundle.putString("pId", personId);
   fragment.setArguments(bundle);

   getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    fragment).commit();

MyFragment Class से:

बंडल से तर्क प्राप्त करें और उन्हें xml पर सेट करें

    Bundle arguments = getArguments();
    String personName = arguments.getString("pName");
    String personEmail = arguments.getString("pEmail");
    String personId = arguments.getString("pId");

    nameTV = v.findViewById(R.id.name);
    emailTV = v.findViewById(R.id.email);
    idTV = v.findViewById(R.id.id);

    nameTV.setText("Name: "+ personName);
    emailTV.setText("Email: "+ personEmail);
    idTV.setText("ID: "+ personId);

कृपया प्रश्न को फिर से पढ़ें, यह खंडित होने के बारे में है
अमीन पिंजरी

1

यह आप बंडल का उपयोग कैसे करते हैं:

Bundle b = new Bundle();
b.putInt("id", id);
Fragment frag= new Fragment();
frag.setArguments(b);

बंडल से मान निकालें:

 bundle = getArguments();
 if (bundle != null) {
    id = bundle.getInt("id");
 }

0

आपका इनपुट टुकड़ा

public class SecondFragment extends Fragment  {


    EditText etext;
    Button btn;
    String etex;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.secondfragment, container, false);
        etext = (EditText) v.findViewById(R.id.editText4);
        btn = (Button) v.findViewById(R.id.button);
        btn.setOnClickListener(mClickListener);
        return v;
    }

    View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            etex = etext.getText().toString();
            FragmentTransaction transection = getFragmentManager().beginTransaction();
            Viewfragment mfragment = new Viewfragment();
            //using Bundle to send data
            Bundle bundle = new Bundle();
            bundle.putString("textbox", etex);
            mfragment.setArguments(bundle); //data being send to SecondFragment
            transection.replace(R.id.frame, mfragment);
            transection.isAddToBackStackAllowed();
            transection.addToBackStack(null);
            transection.commit();

        }
    };



}

आपका दृश्य टुकड़ा

public class Viewfragment extends Fragment {

    TextView txtv;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.viewfrag,container,false);
        txtv = (TextView)  v.findViewById(R.id.textView4);
        Bundle bundle=getArguments();
        txtv.setText(String.valueOf(bundle.getString("textbox")));
        return v;
    }


}

0

यदि आप टुकड़ों के बीच नेविगेशन के लिए ग्राफ का उपयोग कर रहे हैं, तो आप ऐसा कर सकते हैं: खंड A से:

    Bundle bundle = new Bundle();
    bundle.putSerializable(KEY, yourObject);
    Navigation.findNavController(view).navigate(R.id.contactExtendedFragment, bundle);

टुकड़े करने के लिए बी:

    Bundle bundle = getArguments();
    contact = (DISContact) bundle.getSerializable(KEY);

निश्चित रूप से आपकी वस्तु को धारावाहिक लागू करना चाहिए

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