Представления диалоговых фрагментов Android не обновляются

#android #kotlin #dialog

Вопрос:

Я использую фрагмент диалога, и вызывается onViewCreated, однако представления карт не обновляют свою непрозрачность.

Мой код должен отключить и затемнить вид карты, который не выбран, однако ничего не меняется. Вместо этого я попытался поместить код в onCreateView, но он также не работает.

 class AddBookDialogFragment: DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            val builder = AlertDialog.Builder(it)
            // Get the layout inflater
            val inflater = requireActivity().layoutInflater

            // Inflate and set the layout for the dialog
            // Pass null as the parent view because its going in the dialog layout
            builder.setView(inflater.inflate(R.layout.dialog_add_book, null))
                // Add action buttons
                .setPositiveButton("Create") { dialog, id ->
                    // create the book
                }
                .setNegativeButton("Cancel") { _, _ ->
                    dialog?.cancel()
                }
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val addBookRadioGroup: RadioGroup = view.findViewById(R.id.add_book_radio_group)
        view.findViewById<RadioButton>(R.id.isbn_radio_button).isEnabled = true

        addBookRadioGroup.setOnCheckedChangeListener { _, checkedId ->
            // checkedId is the RadioButton selected

            val manualCardView: CardView = view.findViewById(R.id.manual_card_view)
            val isbnCardView: CardView = view.findViewById(R.id.isbn_card_view)

            var disabledCardView: CardView = manualCardView
            var enabledCardView: CardView = isbnCardView

            // Sets which card view will be enabled / disabled
            when (checkedId) {
                R.id.isbn_radio_button -> {
                    disabledCardView = manualCardView
                    enabledCardView = isbnCardView
                }

                R.id.manual_card_view -> {
                    disabledCardView = isbnCardView
                    enabledCardView = manualCardView
                }
            }

            disabledCardView.isEnabled = false
            // Sets opacity to 60%
            disabledCardView.alpha = 0.6F

            enabledCardView.isEnabled = true
            // Sets to opacity to 100%
            enabledCardView.alpha = 1F
        }
    }

    // On create view must be overridden here so that it does not return null, if it returns null onViewCreated won't run
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return layoutInflater.inflate(R.layout.dialog_add_book, container, false)
    }
}
 

Мой xml-файл структурирован следующим образом

 <ConstraintLayout>

    <RadioGroup>
        
        <RadioButton>
        <CardView>
            some TextInputEditTexts to input fields
        </CardView>
        
        <RadioButton>
        <CardView>
            some TextInputEditTexts to input fields
        </CardView>
    </RadioGroup>
</ConstraintLayout>
 

Вот как я отображаю фрагмент диалога

 activity?.supportFragmentManager?.let { it ->
    AddBookDialogFragment().show(it, "Add Book")
}
 

Ответ №1:

попробуйте создать view: View? переменную в своем диалоговом фрагменте и заменить

 builder.setView(inflater.inflate(R.layout.dialog_add_book, null))
     .setPositiveButton("Create") { dialog, id ->
     }
     .setNegativeButton("Cancel") { _, _ ->
     dialog?.cancel()
     }
 

с

 view = inflater.inflate(R.layout.dialog_add_book, null)
builder.setView(view)
     .setPositiveButton("Create") { dialog, id ->
     }
     .setNegativeButton("Cancel") { _, _ ->
     dialog?.cancel()
     }
 

и не забудьте вернуть view переменную в onCreateView методе вместо того, чтобы раздувать другое представление.
Также переопределите этот onDestroyView метод, чтобы предотвратить утечку памяти:

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

Кроме того, R.id.manual_card_view в инструкции switch должно быть R.id.manual_radio_button

Как примечание, включение/отключение представления карты не повлияет на дочерние представления, поэтому с текстовыми полями все еще можно взаимодействовать.

Комментарии:

1. Спасибо! Я понял это до того, как был опубликован этот ответ, но он совершенно правильный