Como usar os métodos setArguments () e getArguments () em Fragments?

98

Eu tenho 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();

Como faço para obter esses dados no Frag2?

Android_programmer_camera
fonte

Respostas:

26

Você tem um método chamado getArguments()que pertence à Fragmentclasse.

codeScriber
fonte
192

Basta ligar getArguments()no seu 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
fonte
12
Está retornando null no meu caso, alguma ideia do porque isso está acontecendo?
Anirudh
2
Você está colocando ArrayList no pacote, mas obtendo um String Array. Você deve fazerbundle.getStringArrayList("elist");
Rafał
1
Você esqueceu a declaração de retorno:return super.onCreateView(inflater, container, savedInstanceState);
user41805
4
Oncreateview ligando o tempo todo. Portanto, basta chamar getarguments no método oncreate (). Ele irá chamar apenas quando o fragmento for destruído ou quando for criado recentemente.
Mohamed Ibrahim
5
@almaz_from_kazan @HabeebPerwad Por que você está usando getArguments() in onCreateView, não in onCreate?
Nik Kober
38

Ex: Adicionar dados: -

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

Ex: Obter dados: -

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

em Frag1:

Bundle b = new Bundle();

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

Frag2.setArguments(b);

em Frag2:

Bundle b = getArguments();

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

É simples assim.

Siva Krishna
fonte
5

Instanciando o Fragmento da maneira correta!

getArguments() setArguments()os métodos parecem muito úteis quando se trata de instanciar um Fragment usando um método estático.
ieMyfragment.createInstance(String msg)

Como fazer isso?

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 você queira passar uma String ao criar uma Instância. É assim que você vai fazer.

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

consulte Mais informação

1) Por que Myfragment.getInstance (String msg) é preferido em vez de novo MyFragment (String msg)?
2) Amostra de código em fragmentos

Rohit Singh
fonte
android.os.Bundle não tem setString. Você quer dizer putString ()?
Stealth Rabino
2

para aqueles como eu que procuram enviar objetos diferentes de primitivos, já que você não pode criar um construtor parametrizado em seu fragmento, apenas adicione um acessador setter em seu fragmento, isso sempre funciona para mim.

Mina Gabriel
fonte
Esse é um caminho errado. Se um fragmento for recriado, ele perderá esses parâmetros. Os parâmetros enviados para o fragmento devem ser serializáveis ​​e passados setArguments(). Parâmetros não serializáveis ​​podem ser definidos com setter, mas devem ser chamados novamente na recriação de atividade / fragmento.
CoolMind