web-dev-qa-db-ja.com

「原因:Java.lang.RuntimeException:ビューにはタグが必要」という実際の意味は何ですか?

欲しいタグがわかれば教えてください。

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)
10
Et Crc

これは通常、DataBindingUtil.inflate()を使用して、データバインディングをサポートしないレイアウトを拡張しようとすると発生します。つまり、インフレートしようとしているレイアウトには、ルート要素が<layout>として含まれていません。

Activityをリファクタリングしてデータバインディングを使用すると、この問題が発生し、Activityには複数のレイアウトがあります。ルートに<layout>要素を含めるようにレイアウトの1つをリファクタリングしましたが、他のレイアウトallをリファクタリングしませんでした(他の画面密度、言語のレイアウト) 、モジュールなど)。

[〜#〜] all [〜#〜]一致する可能性のあるレイアウトがルート要素として<layout>で構成されていることを確認してください。

この開発者用ドキュメントを参照してください レイアウトとバインディング式

15
mukwux

わかりませんが、動作しています。 ????

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

OR

ルートレイアウトがhight/widthの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));

}
3
Et Crc

これは、ライブラリのレイアウトファイル(エラーが報告されたファイル)がアプリモジュール内の別のファイルと同じ名前であるために起こりました。どちらもデータバインディングを使用しました。

1
rajath

このエラーが発生する別のシナリオは、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)
    }
}

ViewHoldersはリサイクルでき、上記のコードではすでにバインドされているビューからバインディングインスタンスを作成しようとしている可能性があるため、データバインディングインスタンスはbindメソッドの外部で初期化する必要があります。

代わりに、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"
    }
}
0
Umar Ahmed

これは、1つのレイアウトがすべての解像度で存在しなかったために起こりました(レイアウトとレイアウト-通常のレイアウトのみでした)。

0
Alberto M

XMLレイアウトをデータバインディングに変換してください。これにより、この例外が発生する可能性があります。

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

「attachToRoot」なしでインフレーターを使用しました。このエラーは常に、アダプターのインフレーターに関連する問題で発生します。

0
GiridharaSPK

通常、Androidでのデータバインディングについて学習しているときに発生します。通常はmain_activity.xmlを使用してからcontent_main.xmlを含めますが、誤って_<layout_タグをコンテンツファイルに挿入しました。この_<layout_および_<data_タグを、setContentView()で使用される親ファイルに配置する必要があります

0
Uzair