web-dev-qa-db-fra.com

passage d'argument à DialogFragment

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?

100
giozh

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

261
JafarKhQ

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")
        }
    }
10
Sam

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.

5
thepoosh

Il y a donc deux façons de passer des valeurs de fragment/activity à fragment de dialogue: -

  1. Créez un objet fragment de dialogue avec la méthode make setter et transmettez valeur/argument.

  2. Passer la valeur/l'argument à travers le paquet.

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 {
    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

Méthode 2:

// 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.

3
duggu

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)
        }
        ...
    }
..

}
0
DINA TAKLIT

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

[...]
}
0
Kirill