`Caused by: java.lang.RuntimeException: view must have a tag`的实际含义是啥?

Posted

技术标签:

【中文标题】`Caused by: java.lang.RuntimeException: view must have a tag`的实际含义是啥?【英文标题】:What the actual meaning `Caused by: java.lang.RuntimeException: view must have a tag`?`Caused by: java.lang.RuntimeException: view must have a tag`的实际含义是什么? 【发布时间】:2019-04-10 14:03:36 【问题描述】:

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

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 ComponentInfocom.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)

【问题讨论】:

看起来您的数据绑定库(或类)有错误。尝试在 xml 中手动设置标签,如果 lib 没有覆盖它们 - 这应该可以解决您的问题。 【参考方案1】:

这通常发生在尝试使用DataBindingUtil.inflate() 为不支持数据绑定的布局充气时。换句话说,您尝试膨胀的布局没有其根元素 &lt;layout&gt;

我在重构 Activity 以使用数据绑定时遇到了这个问题,并且 Activity 有多个布局。我成功地重构了其中一个布局以在其根中包含 &lt;layout&gt; 元素,但我没有重构 所有 其他布局(其他屏幕密度、语言、模块等的布局)。

检查以确保 ALL 可能的匹配布局都配置有 &lt;layout&gt; 作为它们的根元素。

请参阅此开发文档Layouts and binding expressions

【讨论】:

【参考方案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)
    

数据绑定实例应该在绑定方法之外初始化,因为 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】:

这发生在我身上是因为库的布局文件(错误被标记的那个)与应用模块中的另一个同名。两者都使用数据绑定。

【讨论】:

拯救了我的一天,谢谢!【参考方案4】:

不知道,但工作。 ?

  @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            mBinding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.my_wallet, null, false);
            setContentView(mBinding.getRoot());
    

如果您的根布局必须匹配 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));


【讨论】:

不(通常)推荐将 null 作为父级传递,这可能会导致崩溃。你可以改为 (ViewGroup)findViewById(android.R.id.content) 并通过 true 以及【参考方案5】:

通常在学习android中的数据绑定时发生,我们通常使用main_activity.xml,然后包含content_main.xml,但是我们错误地将&lt;layout标签放在了内容文件中。我们需要将这个&lt;layout&lt;data 标签放在setContentView() 中使用的父文件中

【讨论】:

【参考方案6】:

这发生在我身上,因为并非所有分辨率都存在一种布局(它仅在布局和布局正常中)。

【讨论】:

【参考方案7】:

我使用了没有“attachToRoot”的充气机。 与适配器中的充气机有关的问题总是会出现此错误。

【讨论】:

【参考方案8】:

请将 XML 布局转换为数据绑定。这可能会导致这个异常。like

<layout>
xml components here...
</layout>

【讨论】:

【参考方案9】:

我通过将布局包装在 &lt;layout&gt; 标记中来转换布局,但我忘记将命名空间声明移动到开头的 &lt;layout&gt; 标记:

之前

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

【讨论】:

【参考方案10】:

我遇到了同样的错误,我只是清理了我的项目 :) 这是工作

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于`Caused by: java.lang.RuntimeException: view must have a tag`的实际含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Mathematical Problems Caused by CCD

Caused by SSLError

Caused by: java.lang.NoClassDefFoundError:

caused by a circular import.

异常Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DataIntegrityViolationExcep

Caused by org hibernate DuplicateMappingException Duplicat