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?

Android_programmer_camera
quelle

Antworten:

26

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

codeScriber
quelle
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");   
     }
}
Ashakirov
quelle
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")
Arshid KV
quelle
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.

Siva krishna
quelle
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

Rohit Singh
quelle
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.

Mina Gabriel
quelle
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