मेरे पास एक श्रोता के साथ डायलॉगफ्रैगमेंट है जब मेरे टुकड़े में फ़ंक्शन को कॉल करने के लिए एक बटन क्लिक किया जाता है।
जब मैं सकारात्मक बटन पर क्लिक करता हूं तो मुझे 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)
}
}
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)
}
onAttachFragment
को तब कहा जाता है जब इस टुकड़े के बच्चे के रूप में एक टुकड़ा जुड़ा होता है, जो इस मामले में, कभी नहीं और आवश्यक नहीं है।
का उपयोग करें > वर्तमान परिदृश्य के लिए। डायलॉग फ़्रैगमेंट का कोई बच्चा नहीं है इसलिए onAttachFragment
को कभी नहीं बुलाया जाएगा।
श्रोता को मूल खंड से प्रारंभ करने के लिए, उपयोग करें:
// inside fragment lifecycle methods like onviewcreated etc
listener = getParentFragment() as CreateCollectionDialogListener
समस्या आपके खंड प्रबंधक के साथ प्रतीत होती है !! डायलॉगफ्रैगमेंट खोलने के लिए चाइल्डफ्रैगमेंट मैनेजर का उपयोग करने का प्रयास करें।
साथ ही, जांचें कि लेटिनिट श्रोता वास्तव में प्रारंभ किया गया है या नहीं।
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।