欲しいタグがわかれば教えてください。
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)
これは通常、DataBindingUtil.inflate()
を使用して、データバインディングをサポートしないレイアウトを拡張しようとすると発生します。つまり、インフレートしようとしているレイアウトには、ルート要素が<layout>
として含まれていません。
Activityをリファクタリングしてデータバインディングを使用すると、この問題が発生し、Activityには複数のレイアウトがあります。ルートに<layout>
要素を含めるようにレイアウトの1つをリファクタリングしましたが、他のレイアウトallをリファクタリングしませんでした(他の画面密度、言語のレイアウト) 、モジュールなど)。
[〜#〜] all [〜#〜]一致する可能性のあるレイアウトがルート要素として<layout>
で構成されていることを確認してください。
この開発者用ドキュメントを参照してください レイアウトとバインディング式
わかりませんが、動作しています。 ????
@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));
}
これは、ライブラリのレイアウトファイル(エラーが報告されたファイル)がアプリモジュール内の別のファイルと同じ名前であるために起こりました。どちらもデータバインディングを使用しました。
このエラーが発生する別のシナリオは、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"
}
}
これは、1つのレイアウトがすべての解像度で存在しなかったために起こりました(レイアウトとレイアウト-通常のレイアウトのみでした)。
XMLレイアウトをデータバインディングに変換してください。これにより、この例外が発生する可能性があります。
<layout>
xml components here...
</layout>
「attachToRoot」なしでインフレーターを使用しました。このエラーは常に、アダプターのインフレーターに関連する問題で発生します。
通常、Androidでのデータバインディングについて学習しているときに発生します。通常はmain_activity.xmlを使用してからcontent_main.xmlを含めますが、誤って_<layout
_タグをコンテンツファイルに挿入しました。この_<layout
_および_<data
_タグを、setContentView()
で使用される親ファイルに配置する必要があります