【问题标题】:ViewBinding - Included Layout Binding Resulting in Unresolved ReferenceViewBinding - 包含的布局绑定导致未解析的引用
【发布时间】:2020-03-05 10:40:06
【问题描述】:

我正在我的一个片段中实现 ViewBinding。该片段包含如下布局:

...
<androidx.core.widget.NestedScrollView
        android:id="@+id/sv_sudf_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/btn_sudf_continue"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/eav_sudf_avatar">

        <include
            android:id="@+id/l_sudf_details"
            layout="@layout/layout_sign_up_details_fields"/>

    </androidx.core.widget.NestedScrollView>
...

我关注了this answer,但它也不起作用。

片段的生成视图绑定类内部有绑定,但是属性的类型是View。然后当我使用binding.lSudfDetails 引用View 时,类型为LayoutSignUpDetailFieldsBinding。这种类型的来源我无法解决,因为没有生成具有该名称的类,但是我希望它会为其分配正确的绑定类型。这是FragmentSignUpDetailsBinding.java中的属性。

@NonNull
public final View lSudfDetails;

但是,绑定都设置正确,它允许我在嵌套布局中引用视图,但是当我开始构建时,我得到了未解决的引用错误。当我这样引用它们时,Lint 不会抱怨:

binding.lSudfDetails.etSudfDob

编译器确实会失败,但会出现诸如此类的错误

未解决的参考:etSudfDob

绑定本身是根据Android docs创建的:

private var _binding : FragmentSignUpDetailsBinding? = null
private val binding get() = _binding!!

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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    binding.tvSudfWelcome.text = getString(R.string.sign_up_welcome,getString(R.string.app_name))
    binding.lSudfDetails.etSudfDob.setOnClickListener {
            showYearSelection()
    }
}

tvSudfWelcome 绑定使用它不喜欢的嵌套绑定。

【问题讨论】:

  • layout_sign_up_details_fields的根标签是&lt;merge&gt;?
  • @SomeshKumar 没有它的根是LinearLayout。我会改成merge看看有没有区别
  • 没有。它不会有任何区别。你可以添加一些代码..你是如何设置视图绑定的,然后你是如何访问它的?
  • @SomeshKumar 我已将代码添加到问题中
  • 这看起来很完美。有些人在使用 Android Studio 3.6.0 时遇到了关于ViewBinding 的问题。您使用的是最新的 studio v 3.6.1 和 gradle v 3.6.1 吗?

标签: android android-layout android-fragments android-viewbinding


【解决方案1】:

如果您使用的是 Android Studio 3.6.0,有时 gradle 插件无法为包含的布局生成 ViewBinding 字段。请更新到 Android Studio 3.6.1 和 gradle 插件版本到 3.6.1。

【讨论】:

  • 如果你能帮上忙,再来一个 - stackoverflow.com/q/60549985/507313
  • 我使用最新的 AS 仍然遇到这个问题
  • @Jonathan 检查app &gt; build &gt; generated &gt; data_binding_base_class_source_out 文件夹内是否有生成的类(成功构建后)?
  • 发现了这个问题,它与包含的 xml 布局有关,它没有一个 Layout 视图组作为其根视图组。我有一个 CardView 作为它的根布局
【解决方案2】:

如果有人有类似的问题...我解决了为这个包含的视图添加宽度和高度的问题。它有帮助,我不知道为什么,但这将是我的解决方案:

 <include
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:id="@+id/l_sudf_details"
        layout="@layout/layout_sign_up_details_fields"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2021-12-16
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多