web-dev-qa-db-fra.com

Que signifie réellement «Causé par: Java.lang.RuntimeException: la vue doit avoir une balise»?

S'il vous plaît, informez-moi si vous savez quelle étiquette vous voulez.

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

ERREUR 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

Cela se produit généralement lorsque vous essayez d'utiliser DataBindingUtil.inflate() pour gonfler une disposition qui ne prend pas en charge la liaison de données. En d'autres termes, la disposition que vous essayez de gonfler n'a pas son élément racine comme <layout>.

J'ai rencontré ce problème lors de la refactorisation d'un Activity pour utiliser la liaison de données, et le Activity a plusieurs dispositions. J'ai refactorisé avec succès l'une des dispositions pour inclure le <layout> élément à sa racine, mais je n'ai pas refactorisé tout les autres dispositions (dispositions pour d'autres densités d'écran, langues, modules, etc.).

Vérifiez que [~ # ~] tous [~ # ~] les dispositions de correspondance possibles sont configurées avec <layout> comme élément racine.

Voir ce doc développeur Layouts and binding expressions

15
mukwux

AUCUNE idée, mais ça marche. ????

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

OR

si votre disposition racine doit correspondre en tant que match_parrent pour la hauteur/largeur. comme 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

Cela m'est arrivé en raison du fichier de mise en page de la bibliothèque (celui pour lequel l'erreur a été signalée) portant le même nom qu'un autre dans le module d'application. Les deux ont utilisé la liaison de données.

1
rajath

Un autre scénario où cette erreur se produit se trouve dans le ViewHolder d'un RecyclerView.

Évitez d'initialiser une instance de liaison dans la méthode de liaison de 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)
    }
}

L'instance de liaison de données doit être initialisée en dehors de la méthode de liaison, car ViewHolders pourrait être recyclé et dans le code ci-dessus, nous pourrions essayer de créer une instance de liaison à partir d'une vue déjà liée.

Créez plutôt l'instance de liaison dans le bloc d'initialisation de ViewHolder (cela peut être dans init{} bloquer ou juste après la déclaration de classe comme indiqué ci-dessous)

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

cela m'est arrivé car une mise en page n'était pas présente pour toutes les résolutions (c'était seulement dans la mise en page et la mise en page normale).

0
Alberto M

Veuillez convertir la disposition XML en liaison de données. cela peut provoquer cette exception.

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

J'ai utilisé un gonfleur sans "attachToRoot". Cette erreur se produit toujours avec des problèmes liés au gonfleur dans l'adaptateur.

0
GiridharaSPK

Cela se produit généralement lors de l'apprentissage de la liaison de données dans Android, nous utilisons généralement un main_activity.xml, puis incluons content_main.xml, mais nous avons par erreur mis la balise <layout Dans le fichier de contenu. Nous devons mettre cette balise <layout Et <data Dans le fichier parent utilisé dans setContentView()

0
Uzair