¿Cómo usar los métodos setArguments () y getArguments () en Fragments?

98

Tengo 2 fragmentos: (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();

¿Cómo obtengo estos datos en Frag2?

Android_programmer_camera
fuente

Respuestas:

26

Tienes un método llamado getArguments()que pertenece a la Fragmentclase.

codeScriber
fuente
192

Sólo tiene que llamar getArguments()en su Frag2's onCreateView()método:

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
fuente
12
Está devolviendo nulo en mi caso, ¿alguna idea de por qué está sucediendo esto?
Anirudh
2
Está poniendo ArrayList en el paquete, pero obtiene un String Array. Deberías hacerlobundle.getStringArrayList("elist");
Rafał
1
Olvidó la declaración de devolución:return super.onCreateView(inflater, container, savedInstanceState);
user41805
4
Oncreateview llamando todo el tiempo. Así que simplemente llame a getarguments en el método oncreate (). Solo llamará cuando el fragmento se destruya o el tiempo recién creado.
Mohamed Ibrahim
5
@almaz_from_kazan @HabeebPerwad ¿Por qué usas getArguments() in onCreateView, no in onCreate?
Nik Kober
38

Por ejemplo: Agregar datos: -

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

Por ejemplo: obtener datos: -

String latitude =  getArguments().getString("latitude")
Arshid KV
fuente
7

en Frag1:

Bundle b = new Bundle();

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

Frag2.setArguments(b);

en Frag2:

Bundle b = getArguments();

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

Es así de simple.

Siva krishna
fuente
5

¡Instanciando el Fragmento de la manera correcta!

getArguments() setArguments()Los métodos parecen muy útiles cuando se trata de instanciar un Fragmento usando un método estático.
es decirMyfragment.createInstance(String msg)

¿Cómo hacerlo?

Código de fragmento

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

}

Digamos que desea pasar una cadena mientras crea una instancia. Así es como lo harás.

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

Lee mas

1) ¿Por qué se prefiere Myfragment.getInstance (String msg) sobre el nuevo MyFragment (String msg)?
2) Código de muestra en fragmentos

Rohit Singh
fuente
android.os.Bundle no tiene setString. ¿Te refieres a putString ()?
Stealth Rabbi
2

para aquellos como yo que buscan enviar objetos que no sean primitivos, ya que no puede crear un constructor parametrizado en su fragmento, simplemente agregue un descriptor de acceso setter en su fragmento, esto siempre funciona para mí.

Mina Gabriel
fuente
Esa es una forma incorrecta. Si un fragmento se recrea, perderá esos parámetros. Los parámetros enviados al fragmento deben ser serializables, pasados setArguments(). Los parámetros no serializables se pueden configurar con setter, pero se debe volver a llamar en la recreación de actividad / fragmento.
CoolMind