#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. Спасибо! Я понял это до того, как был опубликован этот ответ, но он совершенно правильный