[英]View must have a tag error in android data binding
我有两个屏幕布局。 Activity 在为移动设备设置布局时工作正常,但在为平板设备设置布局时会导致错误。 主要问题是:
原因:java.lang.RuntimeException:视图必须在 com.mypackage.DataBinderMapperImpl.getDataBinder(DataBinderMapperImpl.Z93F725A074133FE1C886F4924)处有标签
不过,当我在移动设备上安装应用程序时,我不会遇到这个问题。
这样我在活动上设置布局:
val resetPasswordActivityBinding = DataBindingUtil.setContentView<ResetPasswordActivityBinding>(this,
R.layout.reset_password_activity)
resetPasswordActivityBinding.resetPasswordViewModel = resetPasswordViewModel
这是我的平板电脑屏幕 XML 布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="resetPasswordViewModel"
type="com.bhi.salesarchitect.user.password.reset.ResetPasswordViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/toolbar"
layout="@layout/app_toolbar_layout"
app:appTheme="@{resetPasswordViewModel.appTheme}"
app:appToolbar="@{resetPasswordViewModel.appToolbar}" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_splash"
android:contentDescription="@null"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:id="@+id/imv_builder_logo_change_pswd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_135"
android:layout_marginBottom="@dimen/space_xxlarge"
android:layout_weight=".5"
android:contentDescription="@null"
android:src="@drawable/ic_logo" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginEnd="@dimen/dp_80"
android:layout_weight=".4">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/space_normal"
android:layout_marginEnd="@dimen/space_normal"
android:contentDescription="@null"
android:scaleType="fitXY"
android:src="@drawable/bg_white_shadow" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingStart="@dimen/space_xxxlarge"
android:paddingEnd="@dimen/space_xxxlarge">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_55"
android:layout_marginBottom="@dimen/space_small"
android:gravity="center"
android:text="@string/a_one_time_password_reset_code_has_been_sent_to_your_email"
android:textColor="@color/blue_dark_main"
android:textSize="@dimen/text_size_normal" />
<EditText
android:id="@+id/et_otp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_normal"
android:background="@drawable/shape_rounded_white"
android:drawablePadding="@dimen/space_small"
android:hint="@string/password_reset_code"
android:inputType="textPersonName"
android:paddingStart="@dimen/space_small"
android:paddingTop="@dimen/space_xsmall"
android:paddingEnd="@dimen/space_xxsmall"
android:paddingBottom="@dimen/space_xsmall"
android:textColor="@android:color/black"
android:textSize="@dimen/sp_15" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_small"
android:background="@drawable/shape_rounded_white"
android:drawableStart="@drawable/ic_password"
android:drawablePadding="@dimen/space_small"
android:hint="@string/new_password"
android:inputType="textPassword"
android:maxLength="@integer/max_password_length"
android:paddingStart="@dimen/space_small"
android:paddingTop="@dimen/space_xsmall"
android:paddingEnd="@dimen/space_xxsmall"
android:paddingBottom="@dimen/space_xsmall"
android:textColor="@android:color/black"
android:textSize="@dimen/sp_15" />
<EditText
android:id="@+id/et_confirm_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/space_small"
android:background="@drawable/shape_rounded_white"
android:drawableStart="@drawable/ic_password"
android:drawablePadding="@dimen/space_small"
android:hint="@string/confirm_new_password"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLength="@integer/max_password_length"
android:paddingStart="@dimen/space_small"
android:paddingTop="@dimen/space_xsmall"
android:paddingEnd="@dimen/space_xxsmall"
android:paddingBottom="@dimen/space_xsmall"
android:textColor="@android:color/black"
android:textSize="@dimen/sp_15" />
<Button
android:id="@+id/bt_submit"
style="@style/ButtonNormal"
android:layout_marginTop="@dimen/space_normal"
android:backgroundTint="@color/blue_dark_main"
android:onClick="@{()-> resetPasswordViewModel.onSubmitClick()}"
android:text="@string/submit"
android:textColor="@android:color/white" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
</FrameLayout>
</LinearLayout>
</layout>
我遇到了这个,当我有:
<layout>
元素),但该布局资源的应用模块版本不是就我而言,应用程序模块的布局是我创建项目时遗留下来的。 删除它解决了问题。
保留两个布局,一个带有 data-binding 布局标签,另一个没有它,是这个问题的常见原因。
当我用相同的名称(/layout 和 /layout-sw720dp)重命名我的两个普通布局文件并使用标签时,我被卡住了。 然后,它适用于移动设备,但不适用于平板电脑。 因此,在清理项目后,一切都开始工作了。
我在使用数组适配器时遇到了这个问题,由于 convertView 上缺少标签而导致崩溃。 在我的 getView() 中,我在做:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
if (convertView == null) {
DataBindingUtil.inflate<ItemSpinnerDropDownWorkPackageFilterBinding>(
LayoutInflater.from(parent.context),
R.layout.item_spinner_drop_down_work_package_filter,
parent,
false
)
} else {
binding = ItemSpinnerDropDownWorkPackageFilterBinding.bind(convertView)
binding.text1.setText(getItem(position))
setDividerVisibility(binding.divider, position)
return convertView
}
}
这是崩溃。 解决方案是在第一次运行时通过 getView 设置标签:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val binding = if (convertView == null) {
DataBindingUtil.inflate<ItemSpinnerDropDownWorkPackageFilterBinding>(
LayoutInflater.from(parent.context),
R.layout.item_spinner_drop_down_work_package_filter,
parent,
false
)
} else {
convertView.tag as ItemSpinnerDropDownWorkPackageFilterBinding
}
binding.text1.setText(getItem(position))
setDividerVisibility(binding.divider, position)
binding.root.tag = binding
return binding.root
}
您需要在 app_toolbar_layout 布局文件的开头添加布局标签
您必须在所有 XML 视图(纵向、横向、平板电脑等)中使用<layout>
标记。 即使您必须将<layout>
标签包含在包含的视图中(“ @layout/app_toolbar_layout
”)。
我遇到了类似的错误,所以我的解决方法是
DataBindingUtil.bind(holder.itemView)?.apply { item = items[position] }
我只需要在删除资源文件后清理和重建。
可能是您有多个 xml 布局文件。
如果您已经在 xml 文件中使用了布局标记,但仍然出现错误,只需重命名布局文件名并再次清理/重建项目即可修复
使用带有数据绑定的 viewStub:
class MyFragment {
lateinit var binding: MyFragmentBinding
lateinit var viewStubBinding: MyViewStubBinding
private fun setViewStub() {
binding.myViewStub.setOnInflateListener { viewStub, view ->
viewStubBinding = binding.myViewStub.binding as MyViewStubBinding // property viewStubBinding is finally inflated
}
binding.myViewStub.viewStub?.inflate() // inflate viewStub with defined layout file in XML
}
}
当我尝试使用MyViewStubBinding.bind(view / viewStub)
它崩溃了View must have a tag 。 发生这种情况是因为 ViewStubProxy 尝试自行膨胀绑定类,所以当我尝试在同一个 Binding 类上自己调用bind()
,它已经被绑定并因此错误而崩溃。
我在尝试单独绑定时遇到此错误,因为我的视图在库中膨胀,但我提供了布局。
医生说你可以这样做:
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
我传递的 viewRoot 派生自自定义类,但最终成为我的布局文件(包含布局标签的文件)的父级。 所以我必须通过findViewById
将视图指定为布局文件的根
我遇到这个问题,根本情况是不同模块中有重复的布局资源文件。 删除多余的以解决问题。
在我的例子中,这段代码使用数据绑定设置内容视图。
binding = GenericItemDetailsListBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.