abstract class BaseFragment(@LayoutRes private val layoutId: Int, private val modelType : Class) : Fragment() { //TODO fin a way to extract class type from k generic without needing //TODO to add extra modeType param or requesting extra data protected lateinit var viewModel: K protected lateinit var binding: T protected abstract fun bindViewModel(binding: T, viewModel: K) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { viewModel = ViewModelProviders.of(this).get(modelType) binding = DataBindingUtil.bind(container?.inflate(layoutId)) bindViewModel(binding, viewModel) setHasOptionsMenu(true) return binding.root } }