How to correctly use Android View Binding in DialogFragment?
Asked Answered
K

1

38

What is correct way of using Android View Binding in DialogFragment()?

Official documentation mentions only Activity and Fragment: https://developer.android.com/topic/libraries/view-binding

Knowledge answered 14/4, 2020 at 10:5 Comment(0)
L
57

Use inflate(LayoutInflater.from(context)) instead. And use binding.root to set the builder view.

Also, as Google suggests, it's best practice to set the binding instance to null at onDestroyView() when using fragments: https://developer.android.com/topic/libraries/view-binding#fragments

Example:

class ExampleDialog : DialogFragment() {

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

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        _binding = DialogExampleBinding.inflate(LayoutInflater.from(context))
        return AlertDialog.Builder(requireActivity())
            .setView(binding.root)
            .create()
    }
    
    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    } 
}
Lafrance answered 30/4, 2020 at 3:24 Comment(8)
This is recommended to prevent crashes but what happens if binding is used after it is set to null? I think it will crash, which means private val binding get() = _binding!! makes no sense at all. Am I missing something?Aliment
You shouldn't use the view once it reaches the onDestroyView life cycle.Titi
Also, it is a better pratice to use your binding as a local variable. No need to override onDestroyView in this case ! :)Titi
This will crash sometimes as @Aliment said.Convery
Is onDestroyView necessary for _binding?Rain
use lateinit for global, and without need of global variable, just use locally inside onviewcreatedConvery
What should I do in case I use FragmentViewBindingDelegate in this case of DialogFragment?Admissive
@IgorGanapolsky, yes. When a fragment recreates a view, it's _binding receives a new value. To detect where a view is destroyed, check _binding == null (for instance, after long loading operations).Wireman

© 2022 - 2024 — McMap. All rights reserved.