ViewBinding в Dialogfragment с использованием customview

У меня вопрос об использовании viewBinding во фрагменте диалогового окна, в котором используется настраиваемое представление. Есть стандартный способ сделать это?

Мой код, который использует findViewById() для фрагмента диалога, но я хотел бы использовать привязку просмотра, поскольку это стандартно для остальной части моего проекта.

class WifiHandlerDialogFragment(private val wifiErrorType: Int): DialogFragment() {

private var _binding: DialogWifiHandlerBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

    _binding = DialogWifiHandlerBinding.inflate(LayoutInflater.from(context))

    val dialog = activity?.let {
        Dialog(it)
    }

    if(dialog != null) {
        dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
        dialog.window?.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
        dialog.setContentView(R.layout.dialog_wifi_handler)
        dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

        val positiveButton = dialog.findViewById<Button>(R.id.positive_button) // really want to change this to use binding
        val closeButton = dialog.findViewById<Button>(R.id.close_button) // really want to change this to use binding
        val dialogMessage = dialog.findViewById<TextView>(R.id.dialog_message)

        positiveButton.setOnClickListener {
            startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
        }
        closeButton.setOnClickListener {
            dismiss()
        }

        dialogMessage.text = when (wifiErrorType) {
            1 ->  getString(R.string.connection_dialog_op1)
            2 -> getString(R.string.connection_dialog_op2)
            3 -> getString(R.string.connection_dialog_op3)
            else -> getString(R.string.error)
        }

    }

    return dialog!!
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}
}

Я пытался использовать binding.closebutton в функции onCreateDialog(), но это не работало (я полагаю, из-за жизненного цикла фрагмента).

Я посмотрел на эти вопросы:

Как правильно использовать привязку представления Android в DialogFragment?

Android DialogFragment onViewCreated не вызывается

Но до сих пор не понял, как лучше всего этого добиться (также я впервые использую viewbinding из синтетики котлина).


person 958    schedule 08.02.2021    source источник


Ответы (1)


Фиксированный. Просто не устанавливал просмотр содержимого на binding.root. Теперь работает нормально. https://medium.com/nerd-for-tech/exploring-view-binding-in-activities-fragments-dialogs-and-recyclerview-adapters-789f84b31a2a

class WifiHandlerDialogFragment(private val wifiErrorType: Int): DialogFragment() {

    private var _binding: DialogWifiHandlerBinding? = null
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

        _binding = DialogWifiHandlerBinding.inflate(LayoutInflater.from(context))

        val dialog = activity?.let {
            Dialog(it)
        }

        if(dialog != null) {
            dialog.window?.requestFeature(Window.FEATURE_NO_TITLE)
            dialog.window?.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
            dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
            dialog.setContentView(binding.root)

            binding.positiveButton.setOnClickListener {
                startActivity(Intent(Settings.ACTION_WIFI_SETTINGS))
            }
            binding.closeButton.setOnClickListener {
                dismiss()
            }

            binding.dialogMessage.text = when (wifiErrorType) {
                1 ->  getString(R.string.connection_dialog_op1)
                2 -> getString(R.string.connection_dialog_op2)
                3 -> getString(R.string.connection_dialog_op3)
                else -> getString(R.string.error)
            }

        }
        return dialog!!
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
person 958    schedule 08.02.2021