en passant l’argument à DialogFragment

Je dois transmettre certaines variables à DialogFragment pour pouvoir effectuer une action. Eclipse suggère que je devrais utiliser

 Fragment#setArguments(Bundle) 

Mais je ne sais pas comment utiliser cette fonction. Comment puis-je l’utiliser pour transmettre des variables à ma boîte de dialog?

Utiliser newInstance

 public static MyDialogFragment newInstance(int num) { MyDialogFragment f = new MyDialogFragment(); // Supply num input as an argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } 

Et obtenez les Args comme ça

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

Voir l’exemple complet ici
http://developer.android.com/reference/android/app/DialogFragment.html

J’avais l’habitude d’envoyer des valeurs de mon listview

Comment envoyer

 mListview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView< ?> parent, View view, int position, long id) { Favorite clickedObj = (Favorite) parent.getItemAtPosition(position); Bundle args = new Bundle(); args.putSsortingng("tar_name", clickedObj.getNameTarife()); args.putSsortingng("fav_name", clickedObj.getName()); FragmentManager fragmentManager = getSupportFragmentManager(); TarifeDetayPopup userPopUp = new TarifeDetayPopup(); userPopUp.setArguments(args); userPopUp.show(fragmentManager, "sam"); return false; } }); 

Comment recevoir à l’ intérieur de la méthode onCreate () de DialogFragment

  Bundle mArgs = getArguments(); Ssortingng nameTrife = mArgs.getSsortingng("tar_name"); Ssortingng nameFav = mArgs.getSsortingng("fav_name"); Ssortingng name = ""; 

// téléchargement de Kotlin

  val fm = fragmentManager val dialogFragment = AddProgFargmentDialog() // my custom FargmentDialog var args: Bundle? = null args?.putSsortingng("title", model.title); dialogFragment.setArguments(args) dialogFragment.show(fm, "Sample Fragment") 

// recevoir

  override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (getArguments() != null) { val mArgs = arguments var myDay= mArgs.getSsortingng("title") } } 

Comme manière générale de travailler avec Fragments, comme JafarKhQ l’a noté, vous ne devriez pas passer les parameters dans le constructeur, mais avec un Bundle .

la méthode intégrée pour cela dans la classe Fragment est setArguments(Bundle) et getArguments() .

En gros, vous Parcelable un paquet contenant tous vos articles Parcelable et les envoyez.
à son tour, votre fragment recevra ces éléments dans onCreate et leur fera la magie.

La manière indiquée dans le lien DialogFragment est une manière de procéder dans un fragment à plusieurs apparences avec un type de données spécifique et fonctionne très bien la plupart du temps, mais vous pouvez également le faire manuellement.

Il y a donc deux manières de transmettre des valeurs de fragment / activity à fragment de dialog: –

  1. Créez un object fragment de dialog avec la méthode make setter et la valeur / argument de passage.

  2. Passer la valeur / l’argument à travers le bundle.

Méthode 1:

 // Fragment or Activity @Override public void onClick(View v) { DialogFragmentWithSetter dialog = new DialogFragmentWithSetter(); dialog.setValue(header, body); dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter"); } // your dialog fragment public class MyDialogFragment extends DialogFragment { Ssortingng header; Ssortingng body; public void setValue(Ssortingng header, Ssortingng body) { this.header = header; this.body = body; } // use above variable into your dialog fragment } 

Note: – Ce n’est pas la meilleure façon de faire

Méthode 2:

 // Fragment or Activity @Override public void onClick(View v) { DialogFragmentWithSetter dialog = new DialogFragmentWithSetter(); Bundle bundle = new Bundle(); bundle.putSsortingng("header", "Header"); bundle.putSsortingng("body", "Body"); dialog.setArguments(bundle); dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter"); } // your dialog fragment public class MyDialogFragment extends DialogFragment { Ssortingng header; Ssortingng body; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { header = getArguments().getSsortingng("header",""); body = getArguments().getSsortingng("body",""); } } // use above variable into your dialog fragment } 

Note: – C’est la meilleure façon de faire.

Dans mon cas, aucun des codes ci bundle-operate dessus avec les bundle-operate fonctionne; Voici ma décision (je ne sais pas si c’est du code correct ou non, mais ça marche dans mon cas):

 public class DialogMessageType extends DialogFragment { private static Ssortingng bodyText; public static DialogMessageType addSomeSsortingng(Ssortingng temp){ DialogMessageType f = new DialogMessageType(); bodyText = temp; return f; }; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Ssortingng[] choiseArray = {"sms", "email"}; Ssortingng title = "Send text via:"; final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(title).setItems(choiseArray, itemClickListener); builder.setCancelable(true); return builder.create(); } DialogInterface.OnClickListener itemClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which){ case 0: prepareToSendCoordsViaSMS(bodyText); dialog.dismiss(); break; case 1: prepareToSendCoordsViaEmail(bodyText); dialog.dismiss(); break; default: break; } } }; [...] } public class SendObjectActivity extends FragmentActivity { [...] DialogMessageType dialogMessageType = DialogMessageType.addSomeSsortingng(ssortingngToSend); dialogMessageType.show(getSupportFragmentManager(),"dialogMessageType"); [...] } 

Juste que je veux montrer comment faire ce qui est dit @ JafarKhQ dans Kotlin pour ceux qui utilisent kotlin qui pourrait les aider et économiser du temps de thème aussi:

vous devez donc créer un object compagnon pour créer une nouvelle fonction newInstance

vous pouvez définir le paramètre de la fonction comme vous le souhaitez. en utilisant

  val args = Bundle() 

vous pouvez définir vos arguments.

Vous pouvez maintenant utiliser args.putSomthing pour append des args.putSomthing que vous donnez comme prameter dans votre fonction newInstance. putSsortingng(key:Ssortingng,str:Ssortingng) pour append une chaîne par exemple, etc.

Maintenant, pour obtenir l’argument, vous pouvez utiliser arguments.getSomthing(Key:Ssortingng) => comme arguments.getSsortingng("1")

voici un exemple complet

 class IntervModifFragment : DialogFragment(), ModContract.View { companion object { fun newInstance( plom:Ssortingng,type:Ssortingng,position: Int):IntervModifFragment { val fragment =IntervModifFragment() val args = Bundle() args.putSsortingng( "1",plom) args.putSsortingng("2",type) args.putInt("3",position) fragment.arguments = args return fragment } } ... override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) fillSpinerPlom(view,arguments.getSsortingng("1")) fillSpinerType(view, arguments.getSsortingng("2")) confirmer_virme.setOnClickListener({on_confirmClick( arguments.getInt("3"))}) val dateSetListener = object : DatePickerDialog.OnDateSetListener { override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int, dayOfMonth: Int) { val datep= DateT(year,monthOfYear,dayOfMonth) updateDateInView(datep.date) } } } ... } 

Maintenant, comment créer votre boîte de dialog, vous pouvez faire quelque chose comme ça dans une autre classe

  val dialog = IntervModifFragment.newInstance(ListInter.list[position].plom,ListInter.list[position].type,position) 

comme ça par exemple

 class InterListAdapter(private val context: Context, linkedList: LinkedList ) : RecyclerView.Adapter() { ... override fun onBindViewHolder(holder: ViewHolder, position: Int) { ... holder.btn_update!!.setOnClickListener { val dialog = IntervModifFragment.newInstance(ListInter.list[position].plom,ListInter.list[position].type,position) val ft = (context as AppCompatActivity).supportFragmentManager.beginTransaction() dialog.show(ft, ContentValues.TAG) } ... } .. }