DialogFragment'a bağımsız değişken geçirme


Yanıtlar:


299

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

Ve Args'i bunun gibi alın

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

Tam örneğe buradan bakın
http://developer.android.com/reference/android/app/DialogFragment.html


Paket kullanmak yerine MyDialogFragment üzerinde özel değişkenler ayarlayabilir misiniz?
SIr Codealot

10
@SIrCodealot etki, Etkinlik veya Parça üzerindeki değişkenleri ayarlamakla aynı olacaktır. Dönüş değişikliği gibi DialogDragment'ı yok eden ve yeniden oluşturan bir şeyle karşılaşırsanız, tüm değişkenleri kaybedersiniz.
inmyth

2
Bu durumda neden aşırı yüklenmiş bir kurucu kullanılmadığını merak edenler için, oldukça öğretici olan başka bir konu tartışmasına bakın: stackoverflow.com/questions/14011808/…
HondaGuy

KaydedilenInstanceState'in kullanılmadığını fark etmem bir dakikamı aldı .
Odys

25

Liste görünümümden bazı değerler gönderirdim

Nasıl gönderilir

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

DialogFragment'ın onCreate () yöntemi içinde nasıl alınır

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

// Kotlin yüklemesi

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

// teslim almak

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

1
Daha iyi cevap!
user55924

1
Teşekkür ederim ! Kotlin versiyonu yardımcı oldu.
ArdenDev

6

Bu nedenle, değerleri parçadan / etkinlikten iletişim kutusuna aktarmanın iki yolu vardır: -

  1. Make setter yöntemiyle iletişim kutusu parçası nesnesi oluşturun ve değer / bağımsız değişken geçirin.

  2. Değer / bağımsız değişkeni paket aracılığıyla iletin.

Yöntem 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
}

Not: - Bu yapmanın en iyi yolu değil

Yöntem 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
}

Not: - Bunu yapmanın en iyi yolu budur.


Paketteki Dizeler olarak Nesneleri veya ArrayList <Objects> öğesini geçirmek için Gson kitaplığını bile kullanabilirsiniz.
Jeffrey

@duggu, neden alıcı ve ayarlayıcı bunu yapmanın en iyi yolu değil?
sky91

5

Fragments ile çalışmanın genel bir yolu olarak, JafarKhQ'nun belirttiği gibi, parametreleri kurucudaki değil, bir Bundle.

Fragmentsınıfta bunun için yerleşik yöntem setArguments(Bundle)ve getArguments().

temel olarak, yaptığınız şey tüm Parcelableöğelerinizin bulunduğu bir paket oluşturmak ve onları göndermek.
karşılığında, Parçanız bu öğeleri içine alacak onCreateve onlara sihir yapacak.

DialogFragmentBağlantıda gösterilen yol, bunu belirli bir veri türüne sahip çoklu görünen bir bölümde yapmanın bir yoluydu ve çoğu zaman iyi çalışıyor, ancak bunu manuel olarak da yapabilirsiniz.


0

Benim durumumda, yukarıdaki kodların hiçbiri bundle-operateçalışmıyor; İşte benim kararım (doğru kod olup olmadığını bilmiyorum ama benim durumumda işe yarıyor):

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) bodyText'i statik olarak depolayarak, bu sınıfın iki örneğinin aynı anda farklı gövde metinleriyle olmasını olanaksız kılarsınız. Bunun yerine onu bir örnek değişkeni olarak saklamamak için bir sebep yok. 2) setArguments (Bundle) kullanarak argüman göndermenin tüm amacı, işletim sisteminin daha sonra düşük bellek durumunda kaybolması durumunda parçayı yeniden oluşturabilmesidir. Çözümünüz ile parça yeniden oluşturulacak ve gövde metni kullanılan iletişim kutusunun son örneği ne olursa olsun (statik olduğu için). Doğru çözüm, gövde metnini paket parametresi olarak ayarlamaktır.
JHH

0

Sadece kendilerine yardımcı olabilecek ve tema zamanından tasarruf sağlayabilecek kotlin kullananlara Kotlin'de @JafarKhQ dediğini nasıl yapacağımı göstermek istiyorum :

bu nedenle, yeni yeni Instance işlevi oluşturmak için eşlik eden bir objet oluşturmanız gerekir

fonksiyonun parametresini istediğiniz gibi ayarlayabilirsiniz. kullanma

 val args = Bundle()

argümanlarınızı ayarlayabilirsiniz.

Artık yeni args.putSomthingInstance fonksiyonunuzda prameter olarak verdiğiniz parametreleri eklemek için kullanabilirsiniz. putString(key:String,str:String)örneğin dize eklemek vb.

Şimdi argümanı almak için arguments.getSomthing(Key:String)=> beğenebilirsinizarguments.getString("1")

işte tam bir örnek

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

    }
  ...
}

Şimdi diyaloğunuzu nasıl oluşturursunuz, başka bir sınıfta buna benzer bir şey yapabilirsiniz

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

örneğin bunun gibi

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.