How to use data-binding with Fragment How to use data-binding with Fragment android android

How to use data-binding with Fragment


The data binding implementation must be in the onCreateView method of the fragment, delete any data Binding that exist in your OnCreate method,your onCreateView should look like this:

public View onCreateView(LayoutInflater inflater,                          @Nullable ViewGroup container,                          @Nullable Bundle savedInstanceState) {    MartianDataBinding binding = DataBindingUtil.inflate(            inflater, R.layout.martian_data, container, false);    View view = binding.getRoot();    //here data must be an instance of the class MarsDataProvider    binding.setMarsdata(data);    return view;}


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

@Overridepublic 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.


Even the other answers may work well, but I want tell best approach.

Use Binding class's inflate as recommended in Android Documentation.

One option is to inflate by DataBindingUtil but when only you don't know have generated binding class.

--You have auto generated binding class, use that class instead of using DataBindingUtil.

In Java

@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    HomeFragmentBinding binding = HomeFragmentBinding.inflate(inflater, container, false);    //set binding variables here    return binding.getRoot();}

In Kotlin

lateinit var binding: HomeFragmentBinding override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {    binding = HomeFragmentBinding.inflate(inflater, container, false)    return binding.root}

In DataBindingUtil class documentation you can see.

inflate

T inflate (LayoutInflater inflater,                 int layoutId,                 ViewGroup parent,                 boolean attachToParent)

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

If your layout biniding class is not generated @See this answer.