Jak używać metod setArguments () i getArguments () we fragmentach?

98

Mam 2 fragmenty: (1) Frag1 (2) Frag2.

Frag1

bundl = new Bundle();
bundl.putStringArrayList("elist", eList);

Frag2 dv = new Frag2();
dv.setArguments(bundl);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.the_fragg,dv);
ft.show(getFragmentManager().findFragmentById(R.id.the_fragg)); 
ft.addToBackStack(null);
ft.commit();

Jak uzyskać te dane w Frag2?

Android_programmer_camera
źródło

Odpowiedzi:

26

Masz metodę o nazwie, getArguments()która należy do Fragmentklasy.

codeScriber
źródło
192

Wystarczy zadzwonić getArguments()w swojej Frag2„s onCreateView()metody:

public class Frag2 extends Fragment {

     public View onCreateView(LayoutInflater inflater,
         ViewGroup containerObject,
         Bundle savedInstanceState){
         //here is your arguments
         Bundle bundle=getArguments(); 

        //here is your list array 
        String[] myStrings=bundle.getStringArray("elist");   
     }
}
Ashakirov
źródło
12
W moim przypadku zwraca wartość null, czy masz pojęcie, dlaczego tak się dzieje?
Anirudh
2
Umieszczasz ArrayList w pakiecie, ale otrzymujesz String Array. Powinieneś to zrobićbundle.getStringArrayList("elist");
Rafał
1
Zapomniałeś instrukcji zwrotu:return super.onCreateView(inflater, container, savedInstanceState);
user41805
4
Oncreateview dzwoni cały czas. Więc po prostu wywołaj getarguments w metodzie oncreate (). Zadzwoni tylko wtedy, gdy fragment zostanie zniszczony lub nowo utworzony czas.
Mohamed Ibrahim
5
@almaz_from_kazan @HabeebPerwad Dlaczego używasz getArguments() w onCreateView, a nie w onCreate?
Nik Kober
38

Np .: Dodaj dane: -

   Bundle bundle = new Bundle();
   bundle.putString("latitude", latitude);
   bundle.putString("longitude", longitude);
   bundle.putString("board_id", board_id);
   MapFragment mapFragment = new MapFragment();
   mapFragment.setArguments(bundle);

Np .: Pobierz dane: -

String latitude =  getArguments().getString("latitude")
Arshid KV
źródło
7

we Frag1:

Bundle b = new Bundle();

b.putStringArray("arrayname that use to retrive in frag2",StringArrayObject);

Frag2.setArguments(b);

we Frag2:

Bundle b = getArguments();

String[] stringArray = b.getStringArray("arrayname that passed in frag1");

To takie proste.

Śiwa Kryszna
źródło
5

Tworzenie instancji fragmentu we właściwy sposób!

getArguments() setArguments()metody wydają się bardzo przydatne, jeśli chodzi o tworzenie wystąpienia fragmentu przy użyciu metody statycznej.
to znaczyMyfragment.createInstance(String msg)

Jak to zrobić?

Kod fragmentu

public MyFragment extends Fragment {

    private String displayMsg;
    private TextView text;

    public static MyFragment createInstance(String displayMsg)
    {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.setString("KEY",displayMsg);
        fragment.setArguments(args);           //set
        return fragment;
    }

    @Override
    public void onCreate(Bundle bundle)
    {
        displayMsg = getArguments().getString("KEY"):    // get 
    }

    @Override
    public View onCreateView(LayoutInlater inflater, ViewGroup parent, Bundle bundle){
        View view = inflater.inflate(R.id.placeholder,parent,false);
        text = (TextView)view.findViewById(R.id.myTextView);
        text.setText(displayMsg)    // show msg
        returm view;
   }

}

Powiedzmy, że chcesz przekazać String podczas tworzenia instancji. Oto jak to zrobisz.

MyFragment.createInstance("This String will be shown in textView");

Czytaj więcej

1) Dlaczego Myfragment.getInstance (String msg) jest preferowany w stosunku do nowego MyFragment (String msg)?
2) Przykładowy kod na fragmentach

Rohit Singh
źródło
android.os.Bundle nie ma setString. Czy masz na myśli putString ()?
Stealth Rabbi
2

dla takich jak ja, którzy chcą wysyłać obiekty inne niż prymitywy, ponieważ nie możesz utworzyć sparametryzowanego konstruktora w swoim fragmencie, po prostu dodaj element ustawiający w swoim fragmencie, to zawsze działa dla mnie.

Mina Gabriel
źródło
To zły sposób. Jeśli fragment zostanie odtworzony, utraci te parametry. Parametry wysyłane do fragmentu powinny być serializowane, przekazywane setArguments(). Parametry, których nie można serializować, można ustawić za pomocą metody ustawiającej, ale należy je ponownie wywołać przy odtwarzaniu aktywności / fragmentu.
CoolMind