मेरे पास एक श्रोता के साथ डायलॉगफ्रैगमेंट है जब मेरे टुकड़े में फ़ंक्शन को कॉल करने के लिए एक बटन क्लिक किया जाता है।

जब मैं सकारात्मक बटन पर क्लिक करता हूं तो मुझे lateinit property listener has not been initialized मिल रहा है।

DialogFragment

class CreateCollectionDialog: DialogFragment() {
    lateinit var listener: CreateCollectionDialogListener

    interface CreateCollectionDialogListener {
        fun onDialogPositiveClick(dialog: DialogFragment, collectionName: String)
        // fun onDialogNegativeClick(dialog: DialogFragment)
    }

    override fun onAttachFragment(childFragment: Fragment) {
        println("onAttachFragment")
        super.onAttachFragment(childFragment)
        listener = context as CreateCollectionDialogListener
        println(listener)
    }

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it)
            val inflater = requireActivity().layoutInflater
            builder.setView(inflater.inflate(R.layout.dialog_collection, null))
                .setPositiveButton("Create", DialogInterface.OnClickListener { dialog, id ->
                    // Create new collection
                    var newCollectionName = view?.findViewById<EditText>(R.id.newCollectionName)?.text.toString()
                    if (!newCollectionName.equals("") && newCollectionName != null) {
                        listener.onDialogPositiveClick(this, newCollectionName)
                    }
                })
                .setNegativeButton("Cancel", DialogInterface.OnClickListener { dialog, id ->
                    // User canceled dialog
                    // listener.onDialogNegativeClick(this)
                })
            builder.create()
        }?: throw IllegalStateException("Activity cannot be null")
    }

    override fun onStart() {
        super.onStart()
        val positive: Button = (dialog as AlertDialog?)!!.getButton(AlertDialog.BUTTON_POSITIVE)
        positive.setTextColor(resources.getColor(R.color.topColor))

        val negative: Button = (dialog as AlertDialog?)!!.getButton(AlertDialog.BUTTON_NEGATIVE)
        negative.setTextColor(Color.RED)
    }
}

टुकड़ा

class CollectionsFragment: Fragment(), CreateCollectionDialog.CreateCollectionDialogListener {
     override fun onOptionsItemSelected(item: MenuItem): Boolean {

        when (item.itemId) {
            R.id.add -> {
                val createDialog = CreateCollectionDialog()
                createDialog.show(fragmentManager!!, "")
                return true
            }
        }
        return false
    }

    override fun onDialogPositiveClick(dialog: DialogFragment, collectionName: String) {
        addNewCollection(collectionName)
    }
}
2
raginggoat 20 जुलाई 2020, 21:06

3 जवाब

सबसे बढ़िया उत्तर

इस समस्या को हल करने का सबसे आसान तरीका श्रोता को संवाद बनाते समय असाइन करना होगा:

when (item.itemId) {
    R.id.add -> {
        val createDialog = CreateCollectionDialog()
        createDialog.listener = this
        createDialog.show(fragmentManager!!, "")
        return true
    }
}

हालांकि, ध्यान दें कि यदि कॉन्फ़िगरेशन परिवर्तन के कारण गतिविधि नष्ट हो जाती है और फिर से बनाई जाती है तो इसमें समस्या होगी।

इसे हल करने के लिए, मैं "लक्षित टुकड़े" की अवधारणा का लाभ उठाऊंगा:

when (item.itemId) {
    R.id.add -> {
        val createDialog = CreateCollectionDialog()
        createDialog.setTargetFragment(this, 0)
        createDialog.show(fragmentManager!!, "")
        return true
    }
}

और अब, आपके अन्य खंड में, listener फ़ील्ड होने के बजाय, आप केवल targetFragment गुण डाल सकते हैं:

if (!newCollectionName.equals("") && newCollectionName != null) {
    val listener = targetFragment as CreateCollectionDialogListener
    listener.onDialogPositiveClick(this, newCollectionName)
}
1
Ben P. 20 जुलाई 2020, 21:25

onAttachFragment को तब कहा जाता है जब इस टुकड़े के बच्चे के रूप में एक टुकड़ा जुड़ा होता है, जो इस मामले में, कभी नहीं और आवश्यक नहीं है।

का उपयोग करें > वर्तमान परिदृश्य के लिए। डायलॉग फ़्रैगमेंट का कोई बच्चा नहीं है इसलिए onAttachFragment को कभी नहीं बुलाया जाएगा।

श्रोता को मूल खंड से प्रारंभ करने के लिए, उपयोग करें:

// inside fragment lifecycle methods like onviewcreated etc
listener = getParentFragment() as CreateCollectionDialogListener
2
Pavneet_Singh 20 जुलाई 2020, 21:36

समस्या आपके खंड प्रबंधक के साथ प्रतीत होती है !! डायलॉगफ्रैगमेंट खोलने के लिए चाइल्डफ्रैगमेंट मैनेजर का उपयोग करने का प्रयास करें।

साथ ही, जांचें कि लेटिनिट श्रोता वास्तव में प्रारंभ किया गया है या नहीं।

0
Samarth Gupta 20 जुलाई 2020, 21:26