ventana studio open from emergente ejemplo custom activity android android-dialogfragment

android - studio - pasar el argumento a DialogFragment



open dialog fragment from activity (6)

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?


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


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

  1. Crea un objeto de fragmento de diálogo con el 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.


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


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


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


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.