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


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.