How to use data-binding with Fragment

后端 未结 14 1029
不思量自难忘°
不思量自难忘° 2020-11-29 16:48

I\'m trying to follow data-binding example from official google doc https://developer.android.com/tools/data-binding/guide.html

except that I\'m trying to apply data

相关标签:
14条回答
  • 2020-11-29 17:19

    You are actually encouraged to use the inflate method of your generated Binding and not the DataBindingUtil:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MainFragmentBinding binding = MainFragmentBinding.inflate(inflater, container, false);
        //set variables in Binding
        return binding.getRoot();
    }
    

    Docs for DataBindingUtil.inflate():

    Use this version only if layoutId is unknown in advance. Otherwise, use the generated Binding's inflate method to ensure type-safe inflation.

    0 讨论(0)
  • 2020-11-29 17:21

    I have been finding Answer for my application and here is the answer for Kotlin Language.

    
    private lateinit var binding: FragmentForgetPasswordBinding
    
    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
    binding=DataBindingUtil.inflate(inflater,R.layout.fragment_forget_password,container,false)
            val viewModel=ViewModelProvider(this).get(ForgetPasswordViewModel::class.java)
            binding.recoveryViewModel=viewModel
            viewModel.forgetPasswordInterface=this
            return binding.root
    }
    
    0 讨论(0)
  • 2020-11-29 17:23

    If you are using ViewModel and LiveData This is the sufficient syntax

    Kotlin Syntax:

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return MartianDataBinding.inflate(
            inflater,
            container,
            false
        ).apply {
            lifecycleOwner = viewLifecycleOwner
            vm = viewModel    // Attach your view model here
        }.root
    }
    
    0 讨论(0)
  • 2020-11-29 17:26

    Very helpful blog about Databinding : https://link.medium.com/HQY2VizKO1

    class FragmentBinding<out T : ViewDataBinding>(
        @LayoutRes private val resId: Int
    ) : ReadOnlyProperty<Fragment, T> {
    
        private var binding: T? = null
    
        override operator fun getValue(
            thisRef: Fragment,
            property: KProperty<*>
        ): T = binding ?: createBinding(thisRef).also { binding = it }
    
        private fun createBinding(
            activity: Fragment
        ): T = DataBindingUtil.inflate(LayoutInflater.from(activity.context),resId,null,true)
    }
    

    Declare binding val like this in Fragment :

    private val binding by FragmentBinding<FragmentLoginBinding>(R.layout.fragment_login)
    

    Don't forget to write this in fragment

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return binding.root
    }
    
    0 讨论(0)
  • 2020-11-29 17:27

    One can simply retrieve view object as mentioned below

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    
    View view = DataBindingUtil.inflate(inflater, R.layout.layout_file, container, false).getRoot();
    
    return view;
    
    }
    
    0 讨论(0)
  • 2020-11-29 17:29

    Just as most have said, but dont forget to set LifeCycleOwner
    Sample in Java i.e

    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        BindingClass binding = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
        ModelClass model = ViewModelProviders.of(getActivity()).get(ViewModelClass.class);
        binding.setLifecycleOwner(getActivity());
        binding.setViewmodelclass(model);
    
        //Your codes here
    
        return binding.getRoot();
    }
    
    0 讨论(0)
提交回复
热议问题