ViewBinding - 包含导致未解析引用的布局绑定
ViewBinding - Included Layout Binding Resulting in Unresolved Reference
我正在我的一个片段中实现 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>
...
我关注了,但是还是不行。
为片段生成的视图绑定 class 具有内部绑定,但是,属性的类型是 View
。然后当我使用 binding.lSudfDetails
引用 View
时,类型是 LayoutSignUpDetailFieldsBinding
。由于没有生成具有该名称的 class,因此我无法计算出此类型的来源,但是我希望它会为其分配正确的绑定类型。这是 FragmentSignUpDetailsBinding.java
.
中的属性
@NonNull
public final View lSudfDetails;
然而,绑定都已正确设置,它允许我在嵌套布局中引用视图,但是当我开始构建时,我遇到了未解决的引用错误。当我这样引用它们时,Lint 不会抱怨:
binding.lSudfDetails.etSudfDob
编译器确实会失败,但会出现类似这样的错误
Unresolved reference: 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
绑定在它不喜欢的嵌套绑定中起作用。
如果您使用 Android Studio 3.6.0,有时 gradle 插件无法为包含的布局生成 ViewBinding 字段。请更新至 Android Studio 3.6.1 并将 gradle 插件版本更新至 3.6.1。
如果有人遇到类似问题...我通过为包含的视图添加宽度和高度来解决我的问题。它有帮助,我不知道为什么,但这是我的解决方案:
<include
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/l_sudf_details"
layout="@layout/layout_sign_up_details_fields"/>
我正在我的一个片段中实现 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>
...
我关注了
为片段生成的视图绑定 class 具有内部绑定,但是,属性的类型是 View
。然后当我使用 binding.lSudfDetails
引用 View
时,类型是 LayoutSignUpDetailFieldsBinding
。由于没有生成具有该名称的 class,因此我无法计算出此类型的来源,但是我希望它会为其分配正确的绑定类型。这是 FragmentSignUpDetailsBinding.java
.
@NonNull
public final View lSudfDetails;
然而,绑定都已正确设置,它允许我在嵌套布局中引用视图,但是当我开始构建时,我遇到了未解决的引用错误。当我这样引用它们时,Lint 不会抱怨:
binding.lSudfDetails.etSudfDob
编译器确实会失败,但会出现类似这样的错误
Unresolved reference: 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
绑定在它不喜欢的嵌套绑定中起作用。
如果您使用 Android Studio 3.6.0,有时 gradle 插件无法为包含的布局生成 ViewBinding 字段。请更新至 Android Studio 3.6.1 并将 gradle 插件版本更新至 3.6.1。
如果有人遇到类似问题...我通过为包含的视图添加宽度和高度来解决我的问题。它有帮助,我不知道为什么,但这是我的解决方案:
<include
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:id="@+id/l_sudf_details"
layout="@layout/layout_sign_up_details_fields"/>