Come trasferire alcuni dati su un altro frammento?


194

Come trasferire alcuni dati ad un altro Fragmentallo stesso modo è stato fatto con extrasper intents?


Cerco di rispondere a questa domanda @ qui . Spero che funzioni.
Ozhanli,

Risposte:


482

Usa a Bundle. Ecco un esempio:

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putInt(key, value);
fragment.setArguments(bundle);

Il pacchetto ha inserito metodi per molti tipi di dati. Vedi questo

Quindi, nel tuo Fragment, recupera i dati (ad esempio nel onCreate()metodo) con:

Bundle bundle = this.getArguments();
if (bundle != null) {
        int myInt = bundle.getInt(key, defaultValue);
}

1
Ciao grazie per la tua risposta, ma dobbiamo implementare qualcosa come Serializable o Parcelable ??
Ankit Srivastava,

No, non è necessario implementare alcuna classe.
Gene,

2
Potrebbe voler aggiungere un segno di spunta per vedere quel pacchetto! = Null prima di tentare di estrarre qualcosa da esso?
Niels

E se hai un frammento esistente in memoria?
powder366

questo codice non funziona, non reindirizza l'attività ai frammenti con i dati
Venkatesh

44

Per estendere ulteriormente la risposta precedente, come stava dicendo Ankit, per oggetti complessi è necessario implementare Serializable. Ad esempio, per l'oggetto semplice:

public class MyClass implements Serializable {
    private static final long serialVersionUID = -2163051469151804394L;
    private int id;
    private String created;
}

In you FromFragment:

Bundle args = new Bundle();
args.putSerializable(TAG_MY_CLASS, myClass);
Fragment toFragment = new ToFragment();
toFragment.setArguments(args);
getFragmentManager()
    .beginTransaction()
    .replace(R.id.body, toFragment, TAG_TO_FRAGMENT)
    .addToBackStack(TAG_TO_FRAGMENT).commit();

nel tuo ToFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

    Bundle args = getArguments();
    MyClass myClass = (MyClass) args
        .getSerializable(TAG_MY_CLASS);

Sei il migliore
hash

1
@Sameera Di solito ho appena messo una stringa con la mia classe di frammento, cioè se ho classe MyFragmentIMGoingTo.java, allora my TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik,

Meglio usare Parcelable come google lo ha raccomandato come tecnica di serializzazione più ottimizzata per il sistema operativo Android.
Gemma

16

getArguments () restituisce null perché "Non riceve nulla"

Prova questo codice per gestire questa situazione

if(getArguments()!=null)
{
int myInt = getArguments().getInt(key, defaultValue);
}

Ciao grazie per la tua risposta, ma dobbiamo implementare qualcosa come Serializable o Parcelable ??
Ankit Srivastava,

sei sicuro? perché ho dovuto implementare Serializable / Parcelable mentre passavo dati complessi tra un frammento e un'attività usando l'intento ......
Ankit Srivastava,

ho provato solo con valori semplici. Nessuna idea sul dispiacere serializzabile o parcelabile
Sakthimuthiah,

1
Dovrebbe essere un commento non rispondere !!
Gemma

14

Codice completo di passaggio dei dati usando frammento in frammento

Fragment fragment = new Fragment(); // replace your custom fragment class 
Bundle bundle = new Bundle();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                bundle.putString("key","value"); // use as per your need
                fragment.setArguments(bundle);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.replace(viewID,fragment);
                fragmentTransaction.commit();

Nella classe di frammenti personalizzati

Bundle mBundle = new Bundle();
mBundle = getArguments();
mBundle.getString(key);  // key must be same which was given in first fragment

dove ottenere viewID?
Hoo,

@Hoo: per favore specifica la tua domanda su cosa vuoi fare
Anand Savjani il


5

Solo per estendere le risposte precedenti - potrebbe aiutare qualcuno. Se getArguments()ritorni null, mettilo al onCreate()metodo e non al costruttore del tuo frammento:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int index = getArguments().getInt("index");
}

1
            First Fragment Sending String To Next Fragment
            public class MainActivity extends AppCompatActivity {
                    private Button Add;
                    private EditText edt;
                    FragmentManager fragmentManager;
                    FragClass1 fragClass1;


                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        Add= (Button) findViewById(R.id.BtnNext);
                        edt= (EditText) findViewById(R.id.editText);

                        Add.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                fragClass1=new FragClass1();
                                Bundle bundle=new Bundle();

                                fragmentManager=getSupportFragmentManager();
                                fragClass1.setArguments(bundle);
                                bundle.putString("hello",edt.getText().toString());
                                FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
                                fragmentTransaction.add(R.id.activity_main,fragClass1,"");
                                fragmentTransaction.addToBackStack(null);
                                fragmentTransaction.commit();

                            }
                        });
                    }
                }
         Next Fragment to fetch the string.
            public class FragClass1 extends Fragment {
                  EditText showFrag1;


                    @Nullable
                    @Override
                    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

                        View view=inflater.inflate(R.layout.lay_frag1,null);
                        showFrag1= (EditText) view.findViewById(R.id.edtText);
                        Bundle bundle=getArguments();
                        String a=getArguments().getString("hello");//Use This or The Below Commented Code
                        showFrag1.setText(a);
                        //showFrag1.setText(String.valueOf(bundle.getString("hello")));
                        return view;
                    }
                }
    I used Frame Layout easy to use.
    Don't Forget to Add Background color or else fragment will overlap.
This is for First Fragment.
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:background="@color/colorPrimary"
        tools:context="com.example.sumedh.fragmentpractice1.MainActivity">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/editText" />
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:id="@+id/BtnNext"/>
    </FrameLayout>


Xml for Next Fragment.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
   android:background="@color/colorAccent"
    android:layout_height="match_parent">
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edtText"/>

</LinearLayout>

3
Spiega la tua risposta? il codice senza alcuna spiegazione non sarà di grande aiuto
Coder

ho scritto il codice in un flusso in modo che possa essere compreso ..... Passare i dati dall'attività principale a FragClass1 con l'uso del bundle.
Sumedh Ulhe,

1

Dalla classe di attività:

Invia i dati utilizzando gli argomenti bundle al frammento e carica il frammento

   Fragment fragment = new myFragment();
   Bundle bundle = new Bundle();
   bundle.putString("pName", personName);
   bundle.putString("pEmail", personEmail);
   bundle.putString("pId", personId);
   fragment.setArguments(bundle);

   getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                    fragment).commit();

Dalla classe myFragment:

Ottieni gli argomenti dal bundle e impostali su XML

    Bundle arguments = getArguments();
    String personName = arguments.getString("pName");
    String personEmail = arguments.getString("pEmail");
    String personId = arguments.getString("pId");

    nameTV = v.findViewById(R.id.name);
    emailTV = v.findViewById(R.id.email);
    idTV = v.findViewById(R.id.id);

    nameTV.setText("Name: "+ personName);
    emailTV.setText("Email: "+ personEmail);
    idTV.setText("ID: "+ personId);

Ti preghiamo di leggere di nuovo la domanda, si tratta di frammento in frammento
Amin Pinjari,

1

Ecco come si usa il bundle:

Bundle b = new Bundle();
b.putInt("id", id);
Fragment frag= new Fragment();
frag.setArguments(b);

recuperare valore dal bundle:

 bundle = getArguments();
 if (bundle != null) {
    id = bundle.getInt("id");
 }

0

Il tuo frammento di input

public class SecondFragment extends Fragment  {


    EditText etext;
    Button btn;
    String etex;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.secondfragment, container, false);
        etext = (EditText) v.findViewById(R.id.editText4);
        btn = (Button) v.findViewById(R.id.button);
        btn.setOnClickListener(mClickListener);
        return v;
    }

    View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            etex = etext.getText().toString();
            FragmentTransaction transection = getFragmentManager().beginTransaction();
            Viewfragment mfragment = new Viewfragment();
            //using Bundle to send data
            Bundle bundle = new Bundle();
            bundle.putString("textbox", etex);
            mfragment.setArguments(bundle); //data being send to SecondFragment
            transection.replace(R.id.frame, mfragment);
            transection.isAddToBackStackAllowed();
            transection.addToBackStack(null);
            transection.commit();

        }
    };



}

frammento di vista

public class Viewfragment extends Fragment {

    TextView txtv;
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.viewfrag,container,false);
        txtv = (TextView)  v.findViewById(R.id.textView4);
        Bundle bundle=getArguments();
        txtv.setText(String.valueOf(bundle.getString("textbox")));
        return v;
    }


}

0

Se stai usando il grafico per la navigazione tra i frammenti puoi farlo: Dal frammento A:

    Bundle bundle = new Bundle();
    bundle.putSerializable(KEY, yourObject);
    Navigation.findNavController(view).navigate(R.id.contactExtendedFragment, bundle);

Per frammentare B:

    Bundle bundle = getArguments();
    contact = (DISContact) bundle.getSerializable(KEY);

Ovviamente il tuo oggetto deve implementare Serializable

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.