android - ViewBinding 实践
问题描述
有没有更通用的方法来初始化这两个初始化行?
private var _binding: MyFragmentViewBinding? = null
private val binding get() = _binding!!
我们是否应该在每次绑定时调用
binding.cancelButton.setOnClickListener { }
binding.homeButton.setOnClickListener { }
binding.aboutButton.setOnClickListener { }
或者创建类变量?
cancelButton = binding.cancelButton
binding.cancelButton.setOnClickListener{}
而且,我们应该binding = null
进去adapter
吗?
解决方案
我认为这更多的是个人喜好。我喜欢用扩展和高阶函数来做
fun <T : ViewDataBinding> Fragment.getDataBinding(layout: Int, container: ViewGroup?): T {
val binding: T = DataBindingUtil.inflate(layoutInflater, layout, container, false)
binding.lifecycleOwner = viewLifecycleOwner
return binding
}
我的片段看起来像这样。
class InviteFragment : Fragment() {
private lateinit var binding: FragmentInviteBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
binding = getDataBinding(R.layout.fragment_invite, container)
return binding.apply {
inviteAll.setOnClickListener(onInviteAllClick)
// You can set as many click listener here
// or some initialization related to view such as
// setting up recycler view adapter and decorators
}.root
}
private val onInviteAllClick = View.OnClickListener {
// Invite users
}
}
通过这样做,您onCreateView
将更具可读性,并且永远不会变得很长。
推荐阅读
- php - Laravel - 如何删除数组中的项目不使用循环
- java - 更新响应对象而不转换为 java 对象
- ruby-on-rails - 根据 Rails 中的另一个表更新数量
- c# - 如何使用 C# 在文件中用单个逗号替换多个选项卡
- java - 喜欢和不喜欢 Firebase 的系统不工作
- python - 使用 pandas 函数合并 2 行
- java - 两个 Comparables 的最小/最大函数
- url - Nginx 混淆 $fastcgi_script_name 和 $fastcgi_path_info
- css - 侧边栏的外观动画不正确
- php - 基于用户角色使用 PHP 和 MYSQL 的登录页面