152 votes

Comment passer une variable d'une activité à un fragment, et la renvoyer ?

Je suis en train de réaliser une application Android, et je veux passer une date entre l'activité et le fragment. Mon activité a un bouton, qui ouvre le fragment : DatePickerFragment.

Dans mon activité je montre une date, que je veux modifier avec le fragment. Je veux donc passer la date au datepicker, et la renvoyer à l'activité.

J'ai essayé beaucoup de solutions, mais aucune ne fonctionne. Le moyen le plus simple serait de passer un argument, mais cela ne peut pas être fait avec des fragments.

4voto

Dale Points 131

Envoi de données de l'activité vers des fragments liés par XML

Si vous créez un fragment dans Android Studio en utilisant l'un des modèles, par exemple Fichier > Nouveau > Fragment > Fragment (Liste), le fragment est lié via XML. La méthode newInstance est créée dans le fragment mais n'est jamais appelée et ne peut donc pas être utilisée pour passer des arguments.

Au lieu de cela, dans l'activité, remplacez la méthode onAttachFragment.

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

Ensuite, lisez les arguments dans la méthode du fragment onCreate comme dans les autres réponses

2voto

sadula anudeep Points 21

Répondant à 2021 Aujourd'hui, le fragment a intégré des méthodes statiques qui sont utilisées pour passer des arguments tout en créant le fragment essayer eux futurs codeurs

lorsque vous créez un fragment, il a la méthode statique suivante avec déjà défini

 public static categoryfrag newInstance(String param1, String param2) {
        categoryfrag fragment = new categoryfrag();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

La méthode onCreate du fragment reçoit des paramètres par le biais d'un code déjà défini.

   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       if (getArguments() != null) {
           mParam1 = getArguments().getString(ARG_PARAM1);
           mParam2 = getArguments().getString(ARG_PARAM2);
         //  rr=getArguments().getInt("ky");
           sn1=mParam1;
           sn2=mParam2;
       }
   }

le code ci-dessous est utilisé dans l'activité où mostpop est le nom de la classe de fragment si vous voulez d'autres types de données modifier ces lignes intégrées ou utiliser le bundle

Fragment mp=mostpop.newInstance("parameter1","parameter2");

0voto

stef Points 38

Vous pouvez simplement instancier votre fragment avec un bundle :

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);

-2voto

Andrés Points 1

La déclaration de variables publiques dans les classes est le moyen le plus simple :

La classe cible :

public class MyFragment extends Fragment {
    public MyCallerFragment caller; // Declare the caller var
...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
           Bundle savedInstanceState) {
        // Do what you want with the vars
        caller.str = "I changed your value!";
        caller.i = 9999;
        ...
        return inflater.inflate(R.layout.my_fragment, container, false);
    }
...
}

Sur la classe de l'appelant :

public class MyCallerFragment extends Fragment {
    public Integer i; // Declared public var
    public String str; // Declared public var
        ...
            FragmentManager fragmentManager = getParentFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();

            myFragment = new MyFragment();
            myFragment.caller = this;
            transaction.replace(R.id.nav_host_fragment, myFragment)
                    .addToBackStack(null).commit();
        ...
}

Si vous voulez utiliser l'activité principale, c'est facile aussi :

Sur la classe d'activité principale :

public class MainActivity extends AppCompatActivity {
    public String str; // Declare public var
    public EditText myEditText; // You can declare public elements too.
                                // Taking care that you have it assigned
                                // correctly.
...
}

Sur la classe appelée :

public class MyFragment extends Fragment {
    private MainActivity main; // Declare the activity var
...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
           Bundle savedInstanceState) {
        // Assign the main activity var
        main = (MainActivity) getActivity();

        // Do what you want with the vars
        main.str = "I changed your value!";
        main.myEditText.setText("Wow I can modify the EditText too!");
        ...
        return inflater.inflate(R.layout.my_fragment, container, false);
    }
...
}

Note : Faites attention lorsque vous utilisez des événements (onClick, onChanged, etc) car vous pouvez vous retrouver dans une situation de "combat" où plusieurs assignent une variable. Le résultat sera que la variable parfois ne va pas changera ou reviendra à la dernière valeur comme par magie.

Pour d'autres combinaisons, utilisez votre créativité :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X