我正在尝试使用视图绑定替换所有 findViewById。但是,我无法使用View Binding更改 NavController 代码行。
val navController = findNavController(this, R.id.mainHostFragment)
Run Code Online (Sandbox Code Playgroud)
到
var binding : ActivityMainBinding
val navController = findNavController(this, binding.mainHostFragment)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我将一个项目从黄油刀迁移到了 android viewBinding。
在 Butterknife 中有类似的东西:
@OnClick(R.id.button)
fun onButtonClicked()
Run Code Online (Sandbox Code Playgroud)
现在我必须像这样设置所有按钮单击侦听器:
binding.button.setOnClickListener { onButtonClicked() }
...
Run Code Online (Sandbox Code Playgroud)
有没有办法实现自定义注释以便能够编写如下内容:
@OnClick(binding.button)
fun onButtonClicked()
Run Code Online (Sandbox Code Playgroud) 目前正在尝试在单元测试中测试与ViewBinding类的交互
"Invalid Input" should {
"disable the LoginButton" {
val viewBinding: FrLoginBinding = mockk()
InvalidInputViewStateBinder.bind(InvalidInput, viewBinding)
verify { viewBinding.loginButton.isEnabled = false }
}
}
Run Code Online (Sandbox Code Playgroud)
我的想法就是这样的。ViewBinding 中的视图是公共最终属性,不能轻易被模拟。至少我做不到。传递View模拟来创建 ViewBinding 也不起作用,因为我必须模拟findViewById它。
有没有人尝试过这个并让它发挥作用?
文档中指定的View Binding 为每个XML 元素生成一个Binding 类,以便于访问和检查,并减轻findViewById.
虽然findViewById通过更昂贵的关联搜索起作用,但由于映射,绑定应该“直接”访问通过 id 搜索的资源。
这种时间闪电是否对应于空间权重?
拥有使用经典完全开发的大型项目findViewById,无法“在黑暗中”转换为 Binding,我们甚至无法进行实验并冒着损害项目的风险。
所以..
给定绑定,应用程序大小增加了多少?Binding 生成的类对维度的影响有多大?
我正在按照 Google 文档中的建议设置 Fragment :
private var _binding: MyBinding? = null
private val binding get() = _binding!!
Run Code Online (Sandbox Code Playgroud)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = MyBinding.inflate(inflater, container, false)
Run Code Online (Sandbox Code Playgroud)
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
Run Code Online (Sandbox Code Playgroud)
现在我正在调用一个协程,据我所知,该协程应限定在此片段的生命周期内。它有一个更长的网络调用,然后成功:
lifecycleScope.launch(Dispatchers.Main) {
when (myViewModel.loadFromNetwork(url)) {
true -> responseSuccess()
false -> responseFailure()
}
}
Run Code Online (Sandbox Code Playgroud)
private suspend fun responseSuccess() {
binding.stateSuccess.visibility = View.VISIBLE
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在loadFromNetwork加载时按下 Android 系统后退按钮时,片段会被销毁并被onDestroyView()调用。因此binding现在是null. 我得到一个 …
的加密鸣叫示例应用程序root分支器具的Android视图绑定为三个应用程序的模块,app,app-rx,和app-simple。所有三个模块都按预期运行。但是,在app和app-rx模块中, 存在 Lint 错误Unresolved reference。
例如,在app和app-rx模块fragment_feed.xml中未解析,而在 中app-simple,参考显示没有导入错误。
已提交IssueTracker错误。请为该问题加注星标以提高其意识。
设置.gradle
rootProject.name='CryptoTweets'
include ':app', ':app-rx', ':app-simple'
Run Code Online (Sandbox Code Playgroud)
项目导航视图
app: CryptoTweets > app > src > main > …android android-fragments kotlin android-databinding android-viewbinding
我正在使用此链接中的AutoClearedValue 类,当视图被销毁时,支持字段变为空,这很好,但我有一个线程(实际上是一个 kotlin 协程),在它完成后,它访问该值(使用 autoCleared)但是如果在它的工作完成之前,我导航到另一个片段(这个片段的视图被破坏),然后它尝试访问该值,但由于它为空,我得到一个异常,因此崩溃。我该怎么办?
还需要将此 autoCleared 用于哪些变量?我将它用于 viewBinding 和 recyclerview 适配器。
目前,我正在使用data binding两种情况:
views以片段方式访问view model。当我与 进行比较时view binding,我发现两种方法都很好(view binding更好地访问views、data binding绑定数据),那么MVVM 应该首选哪种模式?
我应该只移动view binding并处理ViewModel-layout片段中的连接吗?
architecture android mvvm android-databinding android-viewbinding
我看到一些示例,其中使用 inflate() 在 onCreateView() 中定义和使用绑定,并在 onViewCreated() 中使用 bind() 定义和使用绑定。
有什么不同?那么我们的视图(RecyclerView、TextView等)在哪里操作比较好呢?
谷歌文档显示了这样的示例:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = ResultProfileBinding.inflate(inflater, container, false)
val view = binding.root
return view
}
Run Code Online (Sandbox Code Playgroud)
但在一些文章中我们也可以看到这样的内容:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
_binding = ResultProfileBinding.bind(view)
}
Run Code Online (Sandbox Code Playgroud) 我在我的 Fragment 之一中使用 Android Exoplayer。在 Exoplayer 中,我使用自定义控件布局“@layout/custom_player”作为控件。我在布局中有不同的元素,例如我有一个按钮元素“optionBtn”,我想从我的 Kotlin 代码连接到 onclicklistener。不幸的是,这对于视图绑定来说并不是很顺利。
这是 XML Exoplayer
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/playerVIew"
app:resize_mode="fill"
android:animateLayoutChanges="true"
app:controller_layout_id="@layout/custom_player"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
Run Code Online (Sandbox Code Playgroud)
这是科特林代码
...
private var binding: FragmentVideoBinding? = null
private var btnsheetOptions: SheetOptionsBinding? = null
private var sheetDialog: BottomSheetDialog? = null
private var customPlayer: CustomPlayerBinding? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
btnsheetOptions = SheetOptionsBinding.inflate(inflater, null, false)
sheetDialog = BottomSheetDialog(requireContext(), R.style.BottomSheetDialogTheme)
binding = FragmentVideoBinding.inflate(inflater, container, false)
customPlayer = CustomPlayerBinding.inflate(inflater, binding!!.root, true)
return …Run Code Online (Sandbox Code Playgroud)