Wie verwende ich die Methoden setArguments () und getArguments () in Fragmenten?


98

Ich habe 2 Fragmente: (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();

Wie bekomme ich diese Daten in Frag2?

Antworten:


26

Sie haben eine Methode namens getArguments(), die zur FragmentKlasse gehört.


192

Rufen Sie einfach getArguments()in Ihrem Frag2‚s - onCreateView()Methode:

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
In meinem Fall wird null zurückgegeben. Gibt es eine Idee, warum dies geschieht?
Anirudh

2
Sie fügen ArrayList in das Bundle ein, erhalten jedoch ein String-Array. Sie sollten tunbundle.getStringArrayList("elist");
Rafał

1
Sie haben die Rückgabeerklärung vergessen:return super.onCreateView(inflater, container, savedInstanceState);
user41805

4
Oncreateview ruft ständig an. Rufen Sie also einfach getarguments in der Methode oncreate () auf. Es wird nur aufgerufen, wenn das Fragment zerstört oder neu erstellt wurde.
Mohamed Ibrahim

5
@almaz_from_kazan @HabeebPerwad Warum verwenden Sie getArguments() in onCreateView, nicht in onCreate?
Nik Kober

38

ZB: Daten hinzufügen: -

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

ZB: Daten abrufen: -

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

So einfach ist das.


4

Das Fragment richtig instanziieren!

getArguments() setArguments()Methoden scheinen sehr nützlich zu sein, wenn es darum geht, ein Fragment mit einer statischen Methode zu instanziieren.
dhMyfragment.createInstance(String msg)

Wie es geht?

Fragmentcode

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

}

Angenommen, Sie möchten beim Erstellen einer Instanz einen String übergeben. So wirst du es machen.

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

Weiterlesen

1) Warum wird Myfragment.getInstance (String msg) gegenüber neuem MyFragment (String msg) bevorzugt?
2) Beispielcode für Fragmente


android.os.Bundle hat setString nicht. Meinst du putString ()?
Stealth Rabbi

2

Für diejenigen wie mich, die andere Objekte als Grundelemente senden möchten, da Sie in Ihrem Fragment keinen parametrisierten Konstruktor erstellen können, fügen Sie einfach einen Setter-Accessor in Ihr Fragment ein. Dies funktioniert immer für mich.


Das ist ein falscher Weg. Wenn ein Fragment neu erstellt wird, gehen diese Parameter verloren. An das Fragment gesendete Parameter sollten serialisierbar sein und durchlaufen werden setArguments(). Nicht serialisierbare Parameter können mit dem Setter festgelegt werden, sollten jedoch beim erneuten Erstellen von Aktivitäten / Fragmenten erneut aufgerufen werden.
CoolMind
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.