Jak przenieść niektóre dane do innego fragmentu?

194

Jak przenieść niektóre dane do innego Fragmentpodobnie to było zrobione z extrasza intents?

Eugene
źródło
Próbuję odpowiedzieć na to pytanie @ tutaj . Mam nadzieję, że to zadziała.
ozhanli

Odpowiedzi:

482

Użyj a Bundle. Oto przykład:

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

Pakiet wprowadził metody dla wielu typów danych. Zobacz to

Następnie Fragmentpobierz dane (np. onCreate()Metodą) za pomocą:

Bundle bundle = this.getArguments();
if (bundle != null) {
        int myInt = bundle.getInt(key, defaultValue);
}
Pikaling
źródło
1
Cześć, dziękuję za odpowiedź, ale czy musimy zaimplementować coś takiego jak Serializable lub Parcelable?
Ankit Srivastava
Nie, nie musisz implementować żadnych klas.
Gen
2
Może chcesz dodać czek, aby zobaczyć ten pakiet! = Null, zanim spróbujesz coś z niego wyciągnąć?
Niels
A jeśli masz istniejący fragment w pamięci?
powder366
to kod nie działa, nie przekierowuje aktywności do fragmentowania z danymi
Venkatesh
44

Aby jeszcze bardziej rozszerzyć poprzednią odpowiedź, jak mawiał Ankit, w przypadku złożonych obiektów należy zaimplementować Serializable. Na przykład dla prostego obiektu:

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

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

w ToFragment:

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

    Bundle args = getArguments();
    MyClass myClass = (MyClass) args
        .getSerializable(TAG_MY_CLASS);
mike.tihonchik
źródło
Jesteś najlepszy. Dzięki
hash
1
@Sameera Zazwyczaj po prostu umieszczam ciąg znaków w mojej klasie fragmentów, tzn. Jeśli mam klasę MyFragmentIMGoingTo.java, to moja TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik,
Lepsze wykorzystanie Parcelable, ponieważ Google polecił go jako bardziej zoptymalizowaną technikę serializacji dla systemu operacyjnego Android.
Klejnot
16

getArguments () zwraca null, ponieważ „Nic nie dostaje”

Wypróbuj ten kod, aby poradzić sobie z tą sytuacją

if(getArguments()!=null)
{
int myInt = getArguments().getInt(key, defaultValue);
}
Sakthimuthiah
źródło
Cześć, dziękuję za odpowiedź, ale czy musimy zaimplementować coś takiego jak Serializable lub Parcelable?
Ankit Srivastava
jesteś pewien? ponieważ musiałem zaimplementować Serializable / Parcelable, kiedy przekazywałem złożone dane między fragmentem a działaniem przy użyciu zamiaru ......
Ankit Srivastava
próbowałem tylko z prostymi wartościami. Przykro nam
mam
1
To powinien być komentarz, a nie odpowiedź !!
Klejnot
14

Kompletny kod przekazywania danych przy użyciu fragmentu fragmentu

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

W niestandardowej klasie fragmentu

Bundle mBundle = new Bundle();
mBundle = getArguments();
mBundle.getString(key);  // key must be same which was given in first fragment
Anand Savjani
źródło
skąd wziąć viewID?
Hoo
@Hoo: proszę podać swoje pytanie, co chcesz zadać
Anand Savjani,
5

Aby rozszerzyć poprzednie odpowiedzi - może komuś pomóc. Jeśli getArguments()zwracasz null, umieść to w onCreate()metodzie, a nie w konstruktorze swojego fragmentu:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int index = getArguments().getInt("index");
}
Micer
źródło
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>
Sumedh Ulhe
źródło
3
Wyjaśnij swoją odpowiedź? kod bez żadnego wyjaśnienia niewiele pomoże
Coder
Napisałem kod w przepływie, aby można go było zrozumieć ..... Przekazywanie danych z głównej działalności do FragClass1 za pomocą pakietu.
Sumedh Ulhe,
1

Z klasy aktywności:

Wyślij dane przy użyciu argumentów pakietu do fragmentu i załaduj fragment

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

Z klasy myFragment:

Pobierz argumenty z pakietu i ustaw je na 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);
WO King
źródło
Przeczytaj jeszcze raz pytanie, Chodzi o fragment po fragmencie
Amin Pinjari,
1

Oto jak korzystasz z pakietu:

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

pobierz wartość z pakietu:

 bundle = getArguments();
 if (bundle != null) {
    id = bundle.getInt("id");
 }
Marium Jawed
źródło
0

Twój fragment wejściowy

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

        }
    };



}

twój fragment widoku

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


}
Volverine
źródło
0

Jeśli używasz wykresu do nawigacji między fragmentami, możesz to zrobić: Z fragmentu A:

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

Aby podzielić fragment B:

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

Oczywiście twój obiekt musi implementować Serializable

Pesa
źródło