Bagaimana cara mentransfer beberapa data ke Fragmen lain?


194

Bagaimana cara mentransfer beberapa data ke yang lain Fragmentjuga dilakukan extrasuntuk intents?


Saya mencoba menjawab pertanyaan ini @ di sini . Saya harap t berfungsi.
ozhanli

Jawaban:


482

Gunakan a Bundle. Ini sebuah contoh:

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

Bundle telah menempatkan metode untuk banyak tipe data. Lihat ini

Kemudian di Anda Fragment, ambil data (misalnya dalam onCreate()metode) dengan:

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

1
Hai thanx untuk jawaban Anda tetapi apakah kita perlu menerapkan sesuatu ?? seperti Serializable atau Parcelable ??
Ankit Srivastava

Tidak, Anda tidak perlu mengimplementasikan kelas apa pun.
Gene

2
Mungkin ingin menambahkan cek untuk melihat bundel itu! = Tidak sebelum Anda mencoba untuk mendapatkan sesuatu dari itu?
Niels

Dan jika Anda memiliki fragmen yang ada di memori?
powder366

ini kode tidak berfungsi, tidak mengarahkan aktivitas ke fragmen dengan data
Venkatesh

44

Untuk lebih memperluas jawaban sebelumnya, seperti kata Ankit, untuk objek kompleks Anda perlu mengimplementasikan Serializable. Misalnya, untuk objek sederhana:

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

Di dalam diri Anda FromFragment:

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

di ToFragment Anda:

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

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

Anda adalah yang terbaik. Terima kasih
hash

1
@Sameera Saya biasanya hanya meletakkan string dengan kelas fragmen saya, yaitu jika saya memiliki kelas MyFragmentIMGoingTo.java maka TAG_TO_FRAGMENT saya = "MyFragmentIMGoingTo";
mike.tihonchik

Lebih baik menggunakan Parcelable karena Google merekomendasikannya sebagai teknik serialisasi yang lebih dioptimalkan untuk sistem operasi android.
Permata

16

getArguments () mengembalikan nol karena "Tidak mendapatkan apa-apa"

Coba kode ini untuk menangani situasi ini

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

Hai thanx untuk jawaban Anda tetapi apakah kita perlu menerapkan sesuatu ?? seperti Serializable atau Parcelable ??
Ankit Srivastava

apakah Anda yakin? karena saya harus mengimplementasikan Serializable / Parcelable ketika saya melewati data kompleks antara fragmen dan aktivitas dengan menggunakan maksud ......
Ankit Srivastava

saya mencoba dengan nilai-nilai sederhana saja. Tidak tahu tentang Serializable atau Parcelable sorry
Sakthimuthiah

1
Seharusnya komentar bukan jawaban !!
Permata

14

Kode lengkap untuk meneruskan data menggunakan fragmen ke fragmen

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

Di kelas fragmen khusus

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

di mana mendapatkan viewID?
Hoo

@ Hai: tolong jelaskan pertanyaan Anda apa yang ingin Anda tanyakan
Anand Savjani

Bisakah kamu membantuku? stackoverflow.com/questions/32983033/…
Hoo

5

Hanya untuk memperluas jawaban sebelumnya - ini bisa membantu seseorang. Jika Anda getArguments()kembali null, masukkan ke onCreate()metode dan bukan untuk membangun fragmen Anda:

@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
Jelaskan jawabanmu? kode tanpa penjelasan apa pun tidak akan banyak membantu
Coder

saya telah menulis kode dalam aliran sehingga dapat dipahami ..... Melewati data Dari Aktivitas Utama ke FragClass1 dengan menggunakan bundel.
Sumedh Ulhe

1

Dari Kelas Aktivitas:

Kirim data menggunakan argumen bundel ke fragmen dan muat fragmen

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

Dari Kelas myFragment:

Dapatkan argumen dari bundel dan atur ke 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);

Silakan baca pertanyaan lagi, Ini tentang fragmen ke fragmen
Amin Pinjari

1

Ini adalah bagaimana Anda menggunakan bundel:

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

ambil nilai dari bundel:

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

0

Input fragmen Anda

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

        }
    };



}

fragmen tampilan Anda

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

Jika Anda menggunakan grafik untuk navigasi antar fragmen, Anda dapat melakukan ini: Dari fragmen A:

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

Ke fragmen B:

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

Tentu saja objek Anda harus mengimplementasikan Serializable

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.