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?

Odpowiedzi:



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

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

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.


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.