DialogFragment में तर्क पास करना


116

मुझे कुछ चर पास करने होंगे DialogFragment, इसलिए मैं एक कार्रवाई कर सकता हूं। ग्रहण सुझाव देता है कि मुझे उपयोग करना चाहिए

Fragment#setArguments(Bundle)

लेकिन मुझे नहीं पता कि इस फ़ंक्शन का उपयोग कैसे करें। मैं अपने संवाद के लिए चर पास करने के लिए इसका उपयोग कैसे कर सकता हूं?


जवाबों:


299

का उपयोग करते हुए 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;
}

और इस तरह से आर्ग्स प्राप्त करें

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

पूरा उदाहरण यहां देखें
http://developer.android.com/reference/android/app/DialogFragment.html


क्या आप केवल बंडल का उपयोग करने के बजाय MyDialogFragment पर निजी चर सेट कर सकते हैं?
एसआईआर कोडिएलॉट

10
@SIrodealot प्रभाव गतिविधि या टुकड़े पर चर सेट करने के समान होगा। यदि आप ऐसी किसी चीज़ का सामना करते हैं, जो रोटेशन चेंज जैसे डायलॉगड्रैग्मेंट को नष्ट कर देती है और फिर से बना देती है, तो आप सभी चर खो देंगे।
इनमिथ

2
उन सभी के लिए जो सोचते हैं कि इस मामले में एक अतिभारित निर्माता का उपयोग क्यों नहीं किया जाता है, इस विषय पर एक और चर्चा देखें जो अत्यधिक शिक्षाप्रद है: stackoverflow.com/questions/14011808/…
HondaGuy

मुझे यह देखने के लिए एक मिनट लगा कि सेवइंस्टेंसस्टेट का उपयोग नहीं किया गया है।
Odys

25

मैं अपनी सूची से कुछ मान भेजता था

कैसे भेजे

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

DialCFragment के onCreate () विधि के अंदर कैसे प्राप्त करें

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

// कोटलिन अपलोड

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

// प्राप्त करना

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

1
बेहतर जवाब!
user55924

1
धन्यवाद ! कोटलिन संस्करण ने मदद की।
ArdenDev

6

तो खंड / गतिविधि से संवाद टुकड़े तक मूल्यों को पारित करने के दो तरीके हैं: -

  1. सेटर विधि और पास वैल्यू / तर्क के साथ संवाद टुकड़ा ऑब्जेक्ट बनाएं।

  2. बंडल के माध्यम से मान / तर्क पास करें।

विधि 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
}

नोट: - यह सबसे अच्छा तरीका नहीं है

विधि 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
}

नोट: - यह सबसे अच्छा तरीका है।


आप बंडल में स्ट्रिंग्स के रूप में ऑब्जेक्ट्स या ArrayList <ऑब्जेक्ट्स पास करने के लिए Gson लाइब्रेरी का उपयोग भी कर सकते हैं।
जेफरी

@duggu, गेट्टर और सेटर ऐसा करने का सबसे अच्छा तरीका क्यों नहीं है?
Sky91

5

Fragments के साथ काम करने के एक सामान्य तरीके के रूप में, JafarKhQ के अनुसार, आपको कंस्ट्रक्टर में पैरामेट्स को पास नहीं करना चाहिए, लेकिन ए के साथ Bundle

Fragmentकक्षा में इसके लिए बिल्ट-इन विधि है setArguments(Bundle)और getArguments()

मूल रूप से, आप जो भी करते हैं वह आपके सभी Parcelableसामानों के साथ एक बंडल सेट करता है और उन्हें भेजता है।
बदले में, आपके टुकड़े में वे आइटम मिलेंगे onCreateऔर क्या यह उनके लिए जादू है।

जिस तरह से DialogFragmentलिंक में दिखाया गया है वह एक विशिष्ट प्रकार के डेटा के साथ एक बहु दिखने वाले टुकड़े में ऐसा करने का एक तरीका था और अधिकांश समय ठीक काम करता है, लेकिन आप इसे मैन्युअल रूप से भी कर सकते हैं।


0

मेरे मामले में, कोई भी कोड bundle-operateकाम नहीं करता है; यहाँ मेरा निर्णय है (मुझे नहीं पता कि यह उचित कोड है या नहीं, लेकिन यह मेरे मामले में काम करता है):

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) बॉडीटेक्स्ट को स्टैटिकली स्टोर करके, आप अलग-अलग बॉडी टेक्सट के साथ, एक ही समय में इस क्लास के दो उदाहरणों को प्रभावी ढंग से असंभव बना देते हैं। इसके बजाय इसे एक उदाहरण चर के रूप में संग्रहीत नहीं करने का कोई कारण नहीं है। 2) सेटआर्गुमेंट्स (बंडल) का उपयोग करके तर्क भेजने का पूरा उद्देश्य यह है कि ओएस तब कम स्मृति स्थिति में खो जाने की स्थिति में पुन: निर्माण कर सकता है आदि आपके समाधान के साथ टुकड़ा फिर से बनाया जाएगा, और शरीर का पाठ होगा उपयोग किए गए संवाद का अंतिम उदाहरण जो भी हो (चूंकि यह स्थिर है)। सही समाधान शरीर के पाठ को एक बंडल पैरामीटर के रूप में सेट करना है।
जेएचएच

0

बस मैं यह दिखाना चाहता हूं कि कोटलिन में जो लोग कोटलिन का उपयोग करते हैं उनके लिए @JafarKhQ क्या करते हैं, जो उनकी मदद कर सकते हैं और थीम समय भी बचा सकते हैं:

इसलिए आपको नए newInstance फ़ंक्शन बनाने के लिए एक साथी objet बनाना होगा

आप जो कुछ भी चाहते हैं, उस फंक्शन का paremter सेट कर सकते हैं। का उपयोग करते हुए

 val args = Bundle()

आप अपने args सेट कर सकते हैं।

अब आप का उपयोग args.putSomthingकरने के लिए आप का उपयोग कर सकते हैं जो आप अपने newInstance फ़ंक्शन में एक व्यास के रूप में दे। putString(key:String,str:String)उदाहरण के लिए स्ट्रिंग जोड़ने के लिए और इतने पर

अब उस तर्क को प्राप्त करने के लिए जिसका आप उपयोग कर सकते हैं arguments.getSomthing(Key:String) => काarguments.getString("1")

यहाँ एक पूर्ण उदाहरण है

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

    }
  ...
}

अब आप अपना संवाद कैसे बना सकते हैं आप किसी अन्य कक्षा में इस तरह से कुछ कर सकते हैं

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

उदाहरण के लिए इस तरह

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

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.