如果知道想要什么标签,请通知我。
Caused by: java.lang.RuntimeException: view must have a tag
__ BaseActivity.java
@Override
public void setContentView(int layoutResID) {
mBinding.contentParent.removeAllViews();
DataBindingUtil.inflate(LayoutInflater.from(this), layoutResID, mBinding.contentParent, true);
super.setContentView(mBinding.getRoot());
}
__ ChildActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.setContentView(this, R.layout.my_wallet);
}
错误logcat
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mydev}: java.lang.RuntimeException: view must have a tag
at <more...>
Caused by: java.lang.RuntimeException: view must have a tag
at android.databinding.DataBinderMapperImpl.getDataBinder(DataBinderMapperImpl.java:121)
答案 0 :(得分:7)
通常在尝试使用DataBindingUtil.inflate()
来膨胀不支持数据绑定的布局时发生。换句话说,您要膨胀的布局没有其根元素为<layout>
。
在重构 Activity 以使用数据绑定时,我遇到了这个问题,并且 Activity 具有多种布局。我成功地重构了其中的一种布局,在其根部包含了<layout>
元素,但没有重构所有其他布局 all (其他屏幕密度,语言,模块等的布局)。 )。
检查以确保所有所有可能的匹配布局均以<layout>
作为其根元素。
请参阅此开发人员文档Layouts and binding expressions
答案 1 :(得分:2)
发生这种情况是由于库的布局文件(标记了错误的目录文件)与app模块中的另一个文件同名。两者都使用了数据绑定。
答案 2 :(得分:1)
发生此错误的另一种情况是在RecyclerView的ViewHolder中。
避免在ViewHolder的bind方法中初始化绑定实例
class BindingAdapter(private val items: List<Any>): RecyclerView.Adapter<BindingHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindingHolder {}
override fun onBindViewHolder(holder: BindingHolder, position: Int) {
holder.bindItem(items[position])
}
}
class BindingHolder(view: View): RecyclerView.ViewHolder(view) {
fun bindItem(item: Any) {
//Don't do this
val binding = ItemSampleBinding.bind(itemView)
}
}
数据绑定实例应该在bind方法之外初始化,因为ViewHolders可以回收,并且在上面的代码中,我们可以尝试从已经绑定的视图创建绑定实例。
相反,在ViewHolder的初始化块中创建绑定实例(可以在init{}
块中,也可以在类声明之后,如下所示)
class BindingHolder(view: View): RecyclerView.ViewHolder(view) {
val binding = ItemSampleBinding.bind(view)
fun bindItem(item: Any) {
//Rest of ViewHolder logic
//binding.textView.text = "Something nice"
}
}
答案 3 :(得分:0)
不知道,但是可以。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.my_wallet, null, false);
setContentView(mBinding.getRoot());
}
OR
如果您的根布局必须与match_parrent匹配以保持高/宽。像https://github.com/umano/AndroidSlidingUpPanel
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout._activity_layout, null, false);
// TODO resolve this concurrent assignment
// tricky method because sliding layout must be as parent / high is HIGH_EXACT to MATCH_PARENT
setContentView(mBinding.getRoot(), new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
答案 4 :(得分:0)
通常是在学习android中的数据绑定时发生的,我们通常使用main_activity.xml,然后包含content_main.xml,但是我们错误地将<layout
标签放在内容文件中。我们需要将此<layout
和<data
标记放在setContentView()
答案 5 :(得分:0)
发生这种情况是因为并非所有分辨率都存在一个布局(仅存在于布局和正常布局中)。
答案 6 :(得分:0)
我使用了没有“ attachToRoot”的充气机。 与适配器中的充气机相关的问题总是会发生此错误。
答案 7 :(得分:0)
请将XML布局转换为数据绑定。这可能会导致此异常。喜欢
<layout>
xml components here...
</layout>
答案 8 :(得分:0)
我通过将布局包装在 <layout>
标签中来转换我的布局,但我忘记将命名空间声明移至开始的 <layout>
标签:
之前
<layout>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android">
之后
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.constraintlayout.widget.ConstraintLayout>