Necesito pasar algunas variables a DialogFragment
poder 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?
Necesito pasar algunas variables a DialogFragment
poder 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?
Respuestas:
Utilizando 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 los 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 desde mi listview
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 dentro del método 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 = supportFragmentManager
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")
}
}
Entonces, hay dos formas de pasar valores de fragmento / actividad a fragmento de diálogo: -
Cree un objeto de fragmento de diálogo con el método make setter y pase el valor / argumento.
Pasar valor / argumento a través del paquete.
// 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 forma de hacerlo.
// 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 forma de hacerlo.
Como forma general de trabajar con Fragmentos, 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 Fragment
clase es setArguments(Bundle)
y getArguments()
.
Básicamente, lo que haces es configurar un paquete con todos tus Parcelable
artículos y enviarlos.
a su vez, su Fragmento obtendrá esos elementos en suonCreate
y les hará su magia.
la forma que se muestra en el DialogFragment
enlace era una forma de hacer esto en un fragmento de aparición múltiple con un tipo específico de datos y funciona bien la mayor parte del tiempo, pero también puede hacerlo manualmente.
En mi caso, ninguno de los códigos anteriores 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 que quiero mostrar cómo hacer lo que dije @JafarKhQ en Kotlin para aquellos que usan kotlin que podría ayudarlos y también ahorrar tiempo en el tema:
por lo que debe crear un objeto complementario para crear una nueva función newInstance
puede configurar el parámetro de la función como desee. utilizando
val args = Bundle()
puede configurar sus argumentos.
Ahora puede usar args.putSomthing
para agregar sus argumentos que u da como parámetro en su función newInstance.
putString(key:String,str:String)
para agregar una cadena, por ejemplo, y así sucesivamente
Ahora, para obtener el argumento, puede usar
arguments.getSomthing(Key:String)
=> likearguments.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)
así 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)
}
...
}
..
}