কীভাবে কিছু ডেটা অন্য ফ্রেমে ট্রান্সফার করবেন?


194

কিভাবে অন্য কিছু ডেটা স্থানান্তর করতে Fragmentএকইভাবে এটি দিয়ে করা হয়েছিল extrasজন্য intents?


আমি এই প্রশ্নের উত্তর এখানে দেওয়ার চেষ্টা করি । আমি আশা করি কাজ করে।
— ওজনহলি

উত্তর:


481

ব্যবহার ক 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
আপনার উত্তরের জন্য হাই থ্যাঙ্কস তবে আমাদের কি কিছু বাস্তবায়ন করা দরকার ?? সিরিয়ালাইজেবল বা পার্সেবলের মতো ??
— অঙ্কিত শ্রীবাস্তব

না, আপনার কোনও ক্লাস বাস্তবায়নের দরকার নেই।
— জিন

2
সেই বান্ডিলটি দেখতে একটি চেক যোগ করতে চান! = কোনও কিছু বের করার চেষ্টা করার আগে নাল?
— নীলস

এবং যদি আপনার স্মৃতিতে বিদ্যমান খণ্ড থাকে?
— পাউডার366

এটি কোডটি কাজ করছে না, ডেটা দিয়ে খণ্ডগুলিতে ক্রিয়াকলাপ পুনর্নির্দেশ করছে না
— ভেঙ্কটেশ

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);

আপনি সেরা han ধন্যবাদ
— হ্যাশ

1
@ সমিরা আমি সাধারণত আমার খণ্ড শ্রেণীর সাথে একটি স্ট্রিং রেখেছি, অর্থাত্ আমার যদি ক্লাস মাইফ্রেগমেন্ট আইএমগিংটিও জাভা থাকে তবে আমার TAG_TO_FRAGMENT = "মাইফ্রেগমেন্ট আইএমগিংটো";
— mike.tihonchik

গুগল অ্যান্ড্রয়েড অপারেটিং সিস্টেমের জন্য আরও অনুকূলিত সিরিয়ালাইজেশন কৌশল হিসাবে এটি প্রস্তাবিত হিসাবে পার্সেলেবল ব্যবহার ভাল।
— মণি

16

getArguments () বাতিল হচ্ছে কারণ "এটি কিছুই পায় না"

এই পরিস্থিতিটি পরিচালনা করতে এই কোডটি ব্যবহার করে দেখুন

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

আপনার উত্তরের জন্য হাই থ্যাঙ্কস তবে আমাদের কি কিছু বাস্তবায়ন করা দরকার ?? সিরিয়ালাইজেবল বা পার্সেবলের মতো ??
— অঙ্কিত শ্রীবাস্তব

আপনি কি নিশ্চিত? কারণ আমি যখন ইন্টেন্ট ব্যবহার করে একটি খণ্ড এবং ক্রিয়াকলাপের মধ্যে জটিল ডেটা পাস করছিলাম তখন আমাকে সিরিয়ালাইজেবল / পার্সেবল কার্যকর করতে হয়েছিল ......
— অঙ্কিত শ্রীবাস্তব

আমি কেবল সাধারণ মান দিয়ে চেষ্টা করেছি। সিরিয়ালাইজযোগ্য বা পার্সেলেবল দুঃখিত সম্পর্কে কোনও ধারণা নেই
— সাকথিমুথিয়াহ

1
এটি একটি মন্তব্য উত্তর করা উচিত নয় !!
— মণি

14

টুকরা টুকরা টুকরা ব্যবহার করে ডেটা পাস করার সম্পূর্ণ কোড lete

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();

মাইফ্রেগমেন্ট ক্লাস থেকে:

বান্ডিল থেকে আর্গুমেন্টগুলি পান এবং তাদের এক্সএমএল সেট করুন

    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

আপনি যদি খণ্ডগুলির মধ্যে নেভিগেশনের জন্য গ্রাফ ব্যবহার করছেন তবে আপনি এটি করতে পারেন: খণ্ড খ থেকে:

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

খণ্ড খ:

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

অবশ্যই আপনার অবজেক্ট অবশ্যই সিরিয়ালাইজেবল বাস্তবায়ন করতে হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.