J'ai besoin de passer 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 passer des variables à mon dialogue?
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 ma 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.putString("tar_name", clickedObj.getNameTarife());
args.putString("fav_name", clickedObj.getName());
FragmentManager fragmentManager = getSupportFragmentManager();
TarifeDetayPopup userPopUp = new TarifeDetayPopup();
userPopUp.setArguments(args);
userPopUp.show(fragmentManager, "sam");
return false;
}
});
Comment recevoir dans la méthode onCreate () de DialogFragment
Bundle mArgs = getArguments();
String nameTrife = mArgs.getString("tar_name");
String nameFav = mArgs.getString("fav_name");
String name = "";
// téléchargement Kotlin
val fm = supportFragmentManager
val dialogFragment = AddProgFargmentDialog() // my custom FargmentDialog
var args: Bundle? = null
args?.putString("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.getString("title")
}
}
en tant que moyen général de travailler avec des fragments, comme JafarKhQ l’a noté, vous ne devriez pas passer les paramètres 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 configurez un paquet contenant tous vos articles Parcelable
et vous les envoyez.
à son tour, votre fragment récupérera ces objets dans sa onCreate
et leur rendra magique.
la manière indiquée dans le lien DialogFragment
était un moyen de le faire dans un fragment multi-apparaissant avec un type de données spécifique et fonctionnait bien la plupart du temps, mais vous pouvez également le faire manuellement.
Il y a donc deux façons de passer des valeurs de fragment/activity à fragment de dialogue: -
Créez un objet fragment de dialogue avec la méthode make setter et transmettez valeur/argument.
Passer la valeur/l'argument à travers le paquet.
// 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 {
String header;
String body;
public void setValue(String header, String body) {
this.header = header;
this.body = body;
}
// use above variable into your dialog fragment
}
Remarque: - Ce n'est pas la meilleure façon de faire
// Fragment or Activity
@Override
public void onClick(View v) {
DialogFragmentWithSetter dialog = new DialogFragmentWithSetter();
Bundle bundle = new Bundle();
bundle.putString("header", "Header");
bundle.putString("body", "Body");
dialog.setArguments(bundle);
dialog.show(getSupportFragmentManager(), "DialogFragmentWithSetter");
}
// your dialog fragment
public class MyDialogFragment extends DialogFragment {
String header;
String body;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
header = getArguments().getString("header","");
body = getArguments().getString("body","");
}
}
// use above variable into your dialog fragment
}
Remarque: - C'est la meilleure façon de faire.
Je veux juste montrer comment faire ce que dit @JafarKhQ in Kotlin pour ceux qui utilisent kotlin , qui pourraient les aider et économiser du temps à thème:
il faut donc créer un objet compagnon pour créer un nouveau newInstance function
vous pouvez définir le paramètre de la fonction comme bon vous semble . en utilisant
val args = Bundle()
vous pouvez définir vos arguments.
Vous pouvez maintenant utiliser args.putSomthing
pour ajouter vos arguments que vous donnez comme paramètre dans votre fonction newInstance . putString(key:String,str:String)
pour ajouter une chaîne par exemple, etc.
Maintenant, pour obtenir l'argument, vous pouvez utiliser arguments.getSomthing(Key:String)
=> like arguments.getString("1")
voici un exemple complet
class IntervModifFragment : DialogFragment(), ModContract.View
{
companion object {
fun newInstance( plom:String,type:String,position: Int):IntervModifFragment {
val fragment =IntervModifFragment()
val args = Bundle()
args.putString( "1",plom)
args.putString("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.getString("1"))
fillSpinerType(view, arguments.getString("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 dialogue, 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<InterItem> ) : RecyclerView.Adapter<InterListAdapter.ViewHolder>()
{
...
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)
}
...
}
..
}
Dans mon cas, aucun des codes ci-dessus avec bundle-operate
ne fonctionne; Voici ma décision (je ne sais pas s'il s'agit d'un code correct ou non, mais cela fonctionne dans mon cas):
public class DialogMessageType extends DialogFragment {
private static String bodyText;
public static DialogMessageType addSomeString(String temp){
DialogMessageType f = new DialogMessageType();
bodyText = temp;
return f;
};
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final String[] choiseArray = {"sms", "email"};
String 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.addSomeString(stringToSend);
dialogMessageType.show(getSupportFragmentManager(),"dialogMessageType");
[...]
}