pasando argumento a DialogFragment

Respuestas:

299

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

JafarKhQ
fuente
¿Puede establecer variables privadas en MyDialogFragment en lugar de usar bundle?
SIr Codealot
10
@SIrCodealot el efecto sería el mismo que establecer variables en Actividad o Fragmento. Si se enfrenta a algo que destruye y recrea el DialogDragment como un cambio de rotación, perderá todas las variables.
inmyth
2
Para todos aquellos que se preguntan por qué no se utiliza un constructor sobrecargado en este caso, consulte otra discusión sobre el tema que es muy instructiva: stackoverflow.com/questions/14011808/…
HondaGuy
Me tomó un minuto darme cuenta de que no se usa SavedInstanceState .
Odys
25

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")
        }
    }
Sam
fuente
1
¡La mejor respuesta!
user55924
1
Gracias ! La versión de Kotlin ayudó.
ArdenDev
6

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

  1. Cree un objeto de fragmento de diálogo con el método make setter y pase el valor / argumento.

  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 forma 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 forma de hacerlo.

duggu
fuente
Incluso puede usar la biblioteca Gson para pasar Objetos o ArrayList <Objects> como cadenas en el paquete.
Jeffrey
@duggu, ¿por qué getter y setter no es la mejor manera de hacerlo?
sky91
5

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 Fragmentclase es setArguments(Bundle)y getArguments().

Básicamente, lo que haces es configurar un paquete con todos tus Parcelableartí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 DialogFragmentenlace 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.

thepoosh
fuente
0

En mi caso, ninguno de los códigos anteriores bundle-operatefunciona; 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");

[...]
}
Kirill
fuente
1) Al almacenar el bodyText de forma estática, efectivamente hace imposible tener dos instancias de esta clase al mismo tiempo, con diferentes textos de cuerpo. No hay ninguna razón para no almacenarlo como una variable de instancia. 2) El propósito de enviar argumentos usando setArguments (Bundle) es que el sistema operativo pueda volver a crear el fragmento en caso de que se pierda en una situación de poca memoria, etc. Con su solución, el fragmento se volverá a crear y el texto del cuerpo sea ​​cual sea la última instancia del diálogo utilizada (ya que es estático). La solución correcta es establecer el texto del cuerpo como un parámetro de paquete.
JHH
0

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

}
DINA TAKLIT
fuente