web-dev-qa-db-fra.com

Android Attribut de liaison de données introuvable

J'essaie de reproduire cette réponse: Attribut de paramétrage de l'élément enfant de la mise en page inclus

J'ai un simple custom_edit_text.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <data>
        <variable name="hint123" type="String" />
    </data>
    <Android.support.design.widget.TextInputLayout
        Android:id="@+id/emailInputLayout"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content">
        <Android.support.v7.widget.AppCompatEditText
            Android:id="@+id/emailField"
            Android:layout_width="275dp"
            Android:layout_height="wrap_content"
            Android:paddingBottom="16dp"
            Android:paddingTop="14dp"
            Android:hint="@{hint123}"
            Android:textCursorDrawable="@null"
            Android:background="@drawable/edit_text_background"
            Android:fontFamily="@font/eina_regular"
            Android:textColor="@color/edit_text_color"
            Android:textColorHint="@color/edit_text_color"
            Android:textSize="15sp"
            />
    </Android.support.design.widget.TextInputLayout>
</layout>

Et j'inclus dans un autre fichier:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <include
            layout="@layout/custom_edit_text"
            app:hint123="Email"/>
</layout>

Cependant, le projet refuse de compiler après un nettoyage et une reconstruction avec l'erreur:

AAPT: error: attribute hint123 (aka inc.company.appname:hint123) not found.

Des idées?

J'ai aussi

dataBinding {
    enabled = true
}

activé dans le niveau d'application build.gradle

9
Josh

Je pense avoir frappé la solution. Pour activer la liaison des données, vous devez utiliser un @{} expression, et ce qui est dans les accolades doit être valide Java code. Donc, une chaîne littérale doit être enfermée dans des guillemets ... qui doivent être codés comme &quot; À l'intérieur d'une valeur d'attribut XML. Mettez tout ensemble et vous obtenez:

<include
    layout="@layout/custom_edit_text"
    app:hint123="@{&quot;Email&quot;}"/>

Reliure de données fait Travailler pour inclure des fichiers, c'est que la syntaxe d'un littéral est un peu compliquée. J'ai eu le même problème et ce formulaire travaille dans mon projet.

6
big_m

Le problème est dans la mise en page incluse. Vous ne pouvez pas définir Attribut HINT123.
[.____] également, prendre une note que l'inclusion n'est pas prise en charge comme un enfant direct de la mise en page.

Mettez à jour votre code XML inclus comme ci-dessous :

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <Android.support.constraint.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

        <include Android:id="@+id/custom_edit_text"
            layout="@layout/custom_edit_text" />
    </Android.support.constraint.ConstraintLayout>

</layout>

Pour définir l'indice en utilisant la base de données, vous devez la définir dans votre Java ou fichier kotlin.

Voici Java code :

public class YourActivity extends AppCompatActivity {

    YourActivityBinding mBinding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.your_activity);

        mBinding.customEditText.setHint123("Email");
        mBinding.customEditText.executePendingBindings();
    }
}
1
Viraj Patel

J'utilise Android 3.1.1. Et le code suivant fonctionne pour moi, et si vous pouvez l'utiliser, vous pourrez réutiliser "Astuce" comme vous le souhaitez. J'ai un légèrement modifié Fichier de mise en page (Custom_edit_Text.xml) comme suit.

<?xml version="1.0" encoding="utf-8"?>
<data>
    <variable name="cName" type="String" />
    <variable name="user" type="your.package.name.User" />
</data>

<LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@{user.email}" />

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="@{user.mobile}" />

    <Android.support.design.widget.TextInputLayout
        Android:id="@+id/emailInputLayout"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.AppCompatEditText
            Android:layout_width="match_parent"
            Android:layout_height="50dp"
            Android:hint="@{cName.toString()}"
            Android:paddingBottom="16dp"
            Android:paddingTop="14dp"
            Android:textSize="15sp" />

    </Android.support.design.widget.TextInputLayout>
</LinearLayout>

Au-dessus du deuxième "type" est le nom du paquet + le nom de la classe d'utilisateur.

Je crée la classe "utilisateur" dans un fichier distinct comme suit.

public class User {
String email;
String mobile;

User(String email, String mobile) {
    this.email = email;
    this.mobile = mobile;
}


public String getEmail() {
    return email;
}

public String getMobile() {
    return mobile;
}
}

Mainactivitivité intérieure à l'intérieur de Créate () Je crée l'objet utilisateur Créez la chaîne et liez-les.

String email = "xyz@yahoo";
    String mobile = "9999";
    User user = new User(email,mobile);
    CustomEditTextBinding binding = DataBindingUtil.setContentView(this,R.layout.custom_edit_text) ;
    binding.setCName("Yam May");
    binding.setUser(user);

Et j'ai activé la liaison dans le niveau d'application Build.Gradle comme vous l'avez fait.

Une description très détaillée sur la liaison de données peut être trouvée dans https://www.vogella.com/tatudials/androiddatabinding/article.html

0
amitava

Lier les variables en utilisant @{ }

activité_main.xml

</layout>

    <androidx.constraintlayout.widget.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        tools:context=".simple.MainActivity">

        <include layout="@layout/content_main_data_binding"
            bind:name="@{ "Hello World" }" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

content_view.xml

</layout>

    <data>
    <variable
        name="name"
        type="String" />
    </data>

    <TextView
            Android:id="@+id/text"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="@{ name }"/>

 </layout>

GL

0
Braian Coronel