I am using a dialog that has a click, I want to save the listener of click on “onAttach” from configuration changes, the problem is that it prevents the override method of listener on my fragment to get called. When i click the button the method calls onAttach click, the same thing when the config changes.
I dont want to do it using viewmodel, I just don’t know how to fix this, if I remove the click inside the onAttach, still it wont work. Here is my code:
class RedeemGiftCardDialog: DialogFragment() {
private lateinit var binding: DialogRedeemGiftCardBinding
var listener: RedeemGiftCardDialogListener? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = inflate(inflater, R.layout.dialog_redeem_gift_card)
dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textFieldCode.editText?.showKeyboard()
binding.buttonContinue.setOnClickListener {
val text = binding.textFieldCode.editText?.text.toString()
if (text.isBlank() || text.length < 6) {
Toast.makeText(context, "Shënoni kodin për të vazhduar!", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
isLoading(true)
listener?.onRedeemClicked(text)
}
}
fun isLoading(loading: Boolean) {
binding.buttonContinue.isEnabled = !loading
binding.progressBar.isVisible = loading
binding.buttonContinue.text = if (loading) "" else "Aktivizo"
binding.buttonContinue.hideKeyboard()
}
}
interface RedeemGiftCardDialogListener {
fun onRedeemClicked(code: String)
}
//The fragment:
@AndroidEntryPoint
class ProfileFragment : BaseFragment(), ResetBottomSheetListener, RedeemGiftCardDialogListener {
binding.redeemGiftCardLayout.setOnClickListener {
val fm = activity?.supportFragmentManager ?: return@setOnClickListener
val redeemDialog = RedeemGiftCardDialog()
redeemDialog.listener = this
if (!redeemDialog.isAdded) {
redeemDialog.show(fm, redeemDialog.tag)
}
}
}
override fun onRedeemClicked(code: String) {
Log.d("Dialog","clicked")
membershipViewModel.activateGift(code)
}
I am not sure I understood 100% the question. I think you problem is that when the fragments are recreated after config changes the listener is not set in the dialog fragment, and that’s why the click listener doesn’t work.
Instead of setting the listener, try using fragment result listener as explained in the docs, it will work even after config change:
https://developer.android.com/guide/fragments/communicate#fragment-result
4