标签: android-viewbinding

使用视图绑定导航

我正在尝试使用视图绑定替换所有 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-navigation android-viewbinding

5
推荐指数
1
解决办法
4378
查看次数

android viewBinding 的自定义注释,如 Butterknifes“@OnClick”

我将一个项目从黄油刀迁移到了 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)

android kotlin android-viewbinding

5
推荐指数
1
解决办法
345
查看次数

可以模拟/测试 Android ViewBinding 交互吗?

目前正在尝试在单元测试中测试与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它。

有没有人尝试过这个并让它发挥作用?

android unit-testing android-viewbinding

5
推荐指数
1
解决办法
5868
查看次数

视图绑定对应用程序大小的影响有多大?

文档中指定的View Binding 为每个XML 元素生成一个Binding 类,以便于访问和检查,并减轻findViewById.

虽然findViewById通过更昂贵的关联搜索起作用,但由于映射,绑定应该“直接”访问通过 id 搜索的资源。

这种时间闪电是否对应于空间权重?

拥有使用经典完全开发的大型项目findViewById,无法“在黑暗中”转换为 Binding,我们甚至无法进行实验并冒着损害项目的风险。

所以..

给定绑定,应用程序大小增加了多少?Binding 生成的类对维度的影响有多大?

android findviewbyid android-studio android-viewbinding

5
推荐指数
0
解决办法
134
查看次数

Fragment 中的视图绑定导致 KotlinNullPointerException 在生命周期范围内的协程中运行

我正在按照 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. 我得到一个 …

android kotlin kotlin-coroutines android-viewbinding

5
推荐指数
1
解决办法
486
查看次数

Android 视图绑定 - 多模块项目中未解析的引用

问题

加密鸣叫示例应用程序root分支器具的Android视图绑定为三个应用程序的模块,appapp-rx,和app-simple。所有三个模块都按预期运行。但是,在appapp-rx模块中, 存在 Lint 错误Unresolved reference

例如,在appapp-rx模块fragment_feed.xml中未解析,而在 中app-simple,参考显示没有导入错误。

已提交IssueTracker错误。请为该问题加注星标以提高其意识。

配置

  • 安卓工作室 4.1.1
  • Build #AI-201.8743.12.41.6953283,建于2020年11月4日
  • 运行时版本:1.8.0_242-release-1644-b3-6915495 x86_64
  • VM:JetBrains sro 的 OpenJDK 64 位服务器 VM
  • macOS 10.16
  • GC:ParNew、ConcurrentMarkSweep
  • 内存:1979M
  • 核心数:16
  • 注册表:ide.new.welcome.screen.force=true, external.system.auto.import.disabled=true
  • 非捆绑插件:com.android.tool.sizereduction.plugin、com.thoughtworks.gauge、org.jetbrains.kotlin、cn.wjdghd.unique.plugin.id、mobi.hsz.idea.gitignore、com.developerphil.adbidea , com.google.mad-scorecard

建筑学

设置.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

5
推荐指数
1
解决办法
737
查看次数

视图被销毁后从另一个线程访问的 AutoClearedValue

我正在使用此链接中的AutoClearedValue 类,当视图被销毁时,支持字段变为空,这很好,但我有一个线程(实际上是一个 kotlin 协程),在它完成后,它访问该值(使用 autoCleared)但是如果在它的工作完成之前,我导航到另一个片段(这个片段的视图被破坏),然后它尝试访问该值,但由于它为空,我得到一个异常,因此崩溃。我该怎么办?

还需要将此 autoCleared 用于哪些变量?我将它用于 viewBinding 和 recyclerview 适配器。

android kotlin android-viewbinding

5
推荐指数
1
解决办法
151
查看次数

视图绑定应该取代数据绑定吗?

目前,我正在使用data binding两种情况:

  • views以片段方式访问
  • 在布局中订阅数据view model

当我与 进行比较时view binding,我发现两种方法都很好(view binding更好地访问viewsdata binding绑定数据),那么MVVM 应该首选哪种模式?

我应该只移动view binding并处理ViewModel-layout片段中的连接吗?

architecture android mvvm android-databinding android-viewbinding

4
推荐指数
1
解决办法
7785
查看次数

在 Fragment 中哪里使用视图绑定更好?(onCreateView 与 onViewCreated)

我看到一些示例,其中使用 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)

android android-fragments android-viewbinding

4
推荐指数
1
解决办法
2488
查看次数

Android 和 Exoplayer 中的视图绑定

我在我的 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)

android exoplayer android-viewbinding

4
推荐指数
1
解决办法
2160
查看次数