Come utilizzare i metodi setArguments () e getArguments () in Fragments?


98

Ho 2 frammenti: (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();

Come ottengo questi dati in Frag2?

Risposte:


26

Hai un metodo chiamato getArguments()che appartiene alla Fragmentclasse.


192

Basta chiamare getArguments()nel vostro Frag2's onCreateView()metodo:

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
Restituisce null nel mio caso, qualche idea del perché sta accadendo?
Anirudh

2
Stai inserendo ArrayList nel bundle, ma ottieni un String Array. Dovresti farebundle.getStringArrayList("elist");
Rafał

1
Hai dimenticato la dichiarazione di return super.onCreateView(inflater, container, savedInstanceState);
reso

4
Oncreateview chiama tutto il tempo. Quindi chiama semplicemente getarguments nel metodo oncreate (). Chiamerà solo quando il frammento viene distrutto o il tempo appena creato.
Mohamed Ibrahim

5
@almaz_from_kazan @HabeebPerwad Perché usi getArguments() dentro onCreateView, non dentro onCreate?
Nik Kober

38

Ad esempio: Aggiungi dati: -

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

Ad esempio: Ottieni dati: -

String latitude =  getArguments().getString("latitude")

7

in Frag1:

Bundle b = new Bundle();

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

Frag2.setArguments(b);

in Frag2:

Bundle b = getArguments();

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

È così semplice.


5

Istanziare il frammento nel modo corretto!

getArguments() setArguments()i metodi sembrano molto utili quando si tratta di istanziare un frammento utilizzando un metodo statico.
cioèMyfragment.createInstance(String msg)

Come farlo?

Codice frammento

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

}

Supponiamo che tu voglia passare una stringa durante la creazione di un'istanza. Ecco come lo farai.

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

Leggi di più

1) Perché Myfragment.getInstance (String msg) è preferibile al nuovo MyFragment (String msg)?
2) Codice di esempio su Fragments


android.os.Bundle non ha setString. Intendi putString ()?
Stealth Rabbi

2

per quelli come me che stanno cercando di inviare oggetti diversi dalle primitive, dal momento che non puoi creare un costruttore parametrizzato nel tuo frammento, aggiungi semplicemente una funzione di accesso setter nel tuo frammento, questo funziona sempre per me.


È un modo sbagliato. Se un frammento viene ricreato, perderà quei parametri. I parametri inviati al frammento dovrebbero essere serializzabili, passati attraverso setArguments(). I parametri non serializzabili possono essere impostati con setter, ma dovrebbe essere nuovamente richiamato su attività / fragment recreate.
CoolMind
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.