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
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 "
À l'intérieur d'une valeur d'attribut XML. Mettez tout ensemble et vous obtenez:
<include
layout="@layout/custom_edit_text"
app:hint123="@{"Email"}"/>
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.
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();
}
}
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
Lier les variables en utilisant @{ }
</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>
</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