meneruskan argumen ke DialogFragment


116

Saya perlu meneruskan beberapa variabel ke DialogFragment, jadi saya bisa melakukan tindakan. Eclipse menyarankan agar saya menggunakan

Fragment#setArguments(Bundle)

Tapi saya tidak tahu bagaimana menggunakan fungsi ini. Bagaimana saya bisa menggunakannya untuk meneruskan variabel ke dialog saya?


Jawaban:


299

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

Dan dapatkan Arg seperti ini

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

Lihat contoh lengkapnya di sini
http://developer.android.com/reference/android/app/DialogFragment.html


Bisakah Anda menyetel variabel privat di MyDialogFragment daripada menggunakan bundel?
SIr Codealot

10
@SIrCodealot efeknya akan sama dengan mengatur variabel pada Aktivitas atau Fragmen. Jika Anda menghadapi sesuatu yang menghancurkan dan membuat ulang DialogDragment seperti perubahan rotasi, Anda akan kehilangan semua variabel.
mitologi

2
Untuk semua yang bertanya-tanya mengapa konstruktor kelebihan beban tidak digunakan dalam kasus ini, lihat diskusi lain tentang topik yang sangat instruktif: stackoverflow.com/questions/14011808/…
HondaGuy

Butuh waktu satu menit untuk saya perhatikan bahwa saveInstanceState tidak digunakan.
Odys

25

Saya biasa mengirim beberapa nilai dari listview saya

Bagaimana cara mengirim

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

Cara menerima di dalam metode onCreate () dari DialogFragment

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

// Unggahan 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")

// terima

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

1
Jawaban yang lebih baik!
pengguna55924

1
Terima kasih ! Versi Kotlin membantu.
ArdenDev

6

Jadi, ada dua cara untuk meneruskan nilai dari fragmen / aktivitas ke fragmen dialog: -

  1. Buat objek fragmen dialog dengan metode make setter dan berikan nilai / argumen.

  2. Berikan nilai / argumen melalui bundel.

Metode 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
}

Catatan: - Ini bukan cara terbaik untuk melakukannya

Metode 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
}

Catatan: - Ini adalah cara terbaik untuk melakukannya.


Anda bahkan dapat menggunakan perpustakaan Gson untuk meneruskan Objects atau ArrayList <Objects> sebagai Strings dalam Bundle.
Jeffrey

@ duggu, mengapa pengambil dan penyetel bukan cara terbaik untuk melakukannya?
sky91

5

sebagai cara umum bekerja dengan Fragmen, seperti yang dicatat JafarKhQ, Anda tidak boleh meneruskan params di konstruktor tetapi dengan a Bundle.

metode bawaan untuk itu di Fragmentkelas adalah setArguments(Bundle)dan getArguments().

pada dasarnya, yang Anda lakukan adalah menyiapkan paket dengan semua Parcelableitem Anda dan mengirimkannya.
pada gilirannya, Fragmen Anda akan mendapatkan item tersebut onCreatedan melakukan keajaiban bagi mereka.

cara yang ditunjukkan pada DialogFragmenttautan adalah salah satu cara untuk melakukan ini dalam fragmen yang muncul banyak dengan satu jenis data tertentu dan berfungsi dengan baik sebagian besar waktu, tetapi Anda juga dapat melakukannya secara manual.


0

Dalam kasus saya, tidak ada kode di atas yang bundle-operateberfungsi; Ini keputusan saya (saya tidak tahu apakah itu kode yang tepat atau tidak, tetapi berfungsi dalam kasus saya):

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

[...]
}

1) Dengan menyimpan bodyText secara statis, Anda secara efektif membuat tidak mungkin untuk memiliki dua instance dari kelas ini pada saat yang sama, dengan teks isi yang berbeda. Tidak ada alasan untuk tidak menyimpannya sebagai variabel instan. 2) Seluruh tujuan pengiriman argumen menggunakan setArguments (Bundle) adalah OS kemudian dapat membuat kembali fragmen jika hilang dalam situasi memori rendah, dll. Dengan solusi Anda, fragmen akan dibuat ulang, dan teks isi akan menjadi apa pun contoh terakhir dari dialog yang digunakan (karena statis). Solusi yang tepat adalah menyetel teks isi sebagai parameter bundel.
JHH

0

Hanya itu saya ingin menunjukkan bagaimana melakukan apa yang dikatakan @JafarKhQ di Kotlin bagi mereka yang menggunakan kotlin yang mungkin membantu mereka dan menghemat waktu tema juga:

jadi Anda harus membuat objek pendamping untuk membuat fungsi newInstance

Anda dapat mengatur parameter fungsi apa pun yang Anda inginkan. menggunakan

 val args = Bundle()

Anda dapat mengatur argumen Anda.

Anda sekarang dapat menggunakan args.putSomthinguntuk menambahkan argumen yang Anda berikan sebagai prameter dalam fungsi newInstance Anda. putString(key:String,str:String)untuk menambahkan string misalnya dan sebagainya

Sekarang untuk mendapatkan argumen Anda bisa menggunakan arguments.getSomthing(Key:String)=> likearguments.getString("1")

berikut adalah contoh lengkapnya

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

    }
  ...
}

Sekarang bagaimana membuat dialog Anda, Anda dapat melakukan sesuatu seperti ini di kelas lain

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

seperti ini misalnya

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

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.