Inviare dati dall'attività al frammento in Android

Ho due classi. La prima è l'attività, la seconda è un frammento in cui ho qualche EditText. In activity ho una sottoclasse con async-task e nel metodo doInBackground ottengo qualche risultato, che salvo in una variabile. Come posso inviare questa variabile dalla sottoclasse "mia attività" a questo frammento?

Soluzione

Da Activity si inviano dati con intento come:

Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

e nel metodo Fragment onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}
Commentari (30)

Ho trovato un sacco di risposte qui @ stackoverflow.com ma sicuramente questa è la risposta corretta di:

"Invio dati da attività a frammento in android".

Attività:

        Bundle bundle = new Bundle();
        String myMessage = "Stackoverflow is cool!";
        bundle.putString("message", myMessage );
        FragmentClass fragInfo = new FragmentClass();
        fragInfo.setArguments(bundle);
        transaction.replace(R.id.fragment_single, fragInfo);
        transaction.commit();

Frammento:

Leggere il valore nel frammento

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Bundle bundle = this.getArguments();
        String myValue = bundle.getString("message");
        ...
        ...
        ...
        }

o semplicemente

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }
Commentari (3)

Se si passa un riferimento al frammento (sottoclasse concreta di) nel compito asincrono, si può accedere direttamente al frammento.

Alcuni modi di passare il riferimento al frammento nel task async:

  • Se il vostro task async è una classe completa (class FooTask extends AsyncTask), allora passate il vostro frammento nel costruttore.
  • Se il vostro task async è una classe interna, basta dichiarare una variabile finale Fragment nello scope in cui il task async è definito, o come campo della classe esterna. Sarete in grado di accedervi dalla classe interna.
Commentari (1)