pasar el argumento a DialogFragment

Necesito pasar algunas variables a DialogFragment , entonces puedo realizar una acción. Eclipse sugiere que debería usar

 Fragment#setArguments(Bundle) 

Pero no sé cómo usar esta función. ¿Cómo puedo usarlo para pasar variables a mi diálogo?

Usando 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; } 

Y obtén Args así

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

Vea el ejemplo completo aquí
http://developer.android.com/reference/android/app/DialogFragment.html

Solía ​​enviar algunos valores de mi lista

Cómo enviar

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

Cómo recibir el método inside onCreate () de DialogFragment

  Bundle mArgs = getArguments(); String nameTrife = mArgs.getString("tar_name"); String nameFav = mArgs.getString("fav_name"); String name = ""; 

// carga de Kotlin

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

// recibir

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

como una forma general de trabajar con Fragments, como señaló JafarKhQ, no debe pasar los parámetros en el constructor, sino con un Bundle .

el método incorporado para eso en la clase Fragment es setArguments(Bundle) y getArguments() .

básicamente, lo que haces es configurar un paquete con todos tus artículos Parcelable y enviarlos.
a su vez, su Fragmento obtendrá esos elementos en su onCreate y les hará magia.

la forma mostrada en el enlace DialogFragment fue una forma de hacerlo en un fragmento de varias apariciones con un tipo específico de datos y funciona bien la mayor parte del tiempo, pero también puede hacerlo manualmente.

Entonces, hay dos maneras de pasar valores de fragmento / actividad a fragmento de diálogo:

  1. Crear objeto de fragmento de diálogo con método make setter y pass value / argument.

  2. Pasar valor / argumento a través del paquete.

Método 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 } 

Nota: – Esta no es la mejor manera de hacerlo

Método 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 } 

Nota: – Esta es la mejor manera de hacerlo.

En mi caso, ninguno de los códigos anteriores con bundle-operate funciona; Aquí está mi decisión (no sé si es el código correcto o no, pero funciona en mi caso):

 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"); [...] } 

Solo quiero mostrar cómo se hace lo que dice @JafarKhQ en Kotlin para aquellos que usan kotlin que podría ayudarlos y también ahorrar tiempo en el tema:

entonces tienes que crear un objeto compañero para crear una nueva función de instancia

puedes configurar el paremter de la función como quieras. utilizando

  val args = Bundle() 

puedes configurar tus argumentos

Ahora puedes usar args.putSomthing para agregar tus args.putSomthing que args.putSomthing como prameter en tu nueva función de instancia. putString(key:String,str:String) para agregar cadena por ejemplo, etc.

Ahora para obtener el argumento, puede usar arguments.getSomthing(Key:String) => like arguments.getString("1")

aquí hay un ejemplo completo

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

Ahora, cómo crear su diálogo, puede hacer algo como esto en otra clase

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

como este, por ejemplo

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