Comment transférer des données vers un autre fragment?


194

Comment transférer certaines données à une autre de la Fragmentmême manière que extraspour le moment intents?


J'essaie de répondre à cette question @ ici . J'espère que ça marche.
ozhanli

Réponses:


482

Utilisez a Bundle. Voici un exemple:

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

Bundle a mis des méthodes pour de nombreux types de données. Voir ça

Ensuite dans votre Fragment, récupérez les données (par exemple dans la onCreate()méthode) avec:

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

1
Salut merci pour votre réponse, mais devons-nous mettre en œuvre quelque chose comme Serializable ou Parcelable ??
Ankit Srivastava

Non, vous n'avez pas besoin d'implémenter de classes.
Gene

2
Vous voudrez peut-être ajouter une vérification pour voir cet ensemble! = Null avant d'essayer d'en tirer quelque chose?
Niels

Et si vous avez un fragment existant en mémoire?
powder366

ce code ne fonctionne pas, ne redirige pas l'activité vers un fragment avec des données
Venkatesh

44

Pour étendre encore plus la réponse précédente, comme le disait Ankit, pour les objets complexes, vous devez implémenter Serializable. Par exemple, pour l'objet simple:

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

En vous 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();

dans votre ToFragment:

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

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

Vous êtes le meilleur.Merci
hash

1
@Sameera Je mets généralement une chaîne avec ma classe de fragments, c'est-à-dire si j'ai la classe MyFragmentIMGoingTo.java alors mon TAG_TO_FRAGMENT = "MyFragmentIMGoingTo";
mike.tihonchik

Mieux utiliser Parcelable comme Google l'a recommandé comme technique de sérialisation plus optimisée pour le système d'exploitation Android.
Gem

16

getArguments () retourne null car "Son ne reçoit rien"

Essayez ce code pour gérer cette situation

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

Salut merci pour votre réponse, mais devons-nous implémenter quelque chose comme Serializable ou Parcelable ??
Ankit Srivastava

êtes-vous sûr? parce que j'ai dû implémenter Serializable / Parcelable lorsque je passais des données complexes entre un fragment et une activité en utilisant l'intention ......
Ankit Srivastava

j'ai essayé avec des valeurs simples seulement. Aucune idée de Serializable ou Parcelable désolé
Sakthimuthiah

1
Ce devrait être un commentaire pas de réponse !!
Gem

14

Code complet de transmission de données à l'aide de fragments à fragments

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

Dans la classe de fragment personnalisé

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

où trouver viewID?
Hoo

@Hoo: veuillez préciser votre question ce que vous voulez demander
Anand Savjani


5

Juste pour étendre les réponses précédentes - cela pourrait aider quelqu'un. Si votre getArguments()retourne null, mettez-le à la onCreate()méthode et non au constructeur de votre fragment:

@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
Expliquez votre réponse? le code sans aucune explication ne fera pas beaucoup d'aide
Codeur

J'ai écrit du code dans un flux pour que cela puisse être compris ..... Passage des données de l'activité principale à FragClass1 avec utilisation du bundle.
Sumedh Ulhe

1

De la classe d'activité:

Envoyer les données en utilisant des arguments de bundle au fragment et charger le fragment

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

De la classe myFragment:

Obtenez les arguments du bundle et définissez-les sur 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);

Veuillez relire la question, il s'agit d'un fragment à l'autre
Amin Pinjari

1

Voici comment vous utilisez le bundle:

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

récupérer la valeur du bundle:

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

0

Votre fragment d'entrée

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

        }
    };



}

votre fragment de vue

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

Si vous utilisez un graphique pour la navigation entre les fragments, vous pouvez le faire: A partir du fragment A:

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

Pour fragmenter B:

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

Bien sûr, votre objet doit implémenter Serializable

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.