“Causeed by: java.lang.RuntimeException: view must a tag”的实际含义是什么?

2022-09-02 23:48:28

如果知道想要什么标签,请告诉我。

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);
}

错误日志

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)

答案 1

当尝试使用来膨胀不支持数据绑定的布局时,通常会发生这种情况。换句话说,您尝试膨胀的布局没有其根元素为 。DataBindingUtil.inflate()<layout>

在重构活动以使用数据绑定时,我遇到了此问题,并且活动具有多个布局。我成功地重构了其中一个布局,以在其根目录中包含该元素,但我没有重构所有其他布局(其他屏幕密度,语言,模块等的布局)。<layout>

检查以确保所有可能的匹配布局都配置为其根元素。<layout>

请参阅此开发人员文档布局和绑定表达式


答案 2

发生此错误的另一种情况是在 RecyclerView 的 ViewHolder 中。

避免在 ViewHolder 的绑定方法中初始化绑定实例

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"
    }
}

推荐