J'essaie d'utiliser la liaison de données bidirectionnelle pour modifier les données utilisateur. Je suis en mesure d'afficher le contenu POJO dans la vue, mais les modifications apportées par l'utilisateur ne sont pas en mesure de récupérer avec POJO.Liaison de données Android bidirectionnelle ne fonctionne pas
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User();
user.setFirstName("first a");
user.setLastName("last b");
binding.setUser(user);
}
public void Click(View v){
//ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
User user = binding.getUser();
Toast.makeText(this,user.getFirstName(),Toast.LENGTH_LONG).show();
}
}
J'ai essayé d'utiliser une variable globale pour user
, binding
aussi. Mais quand je clique sur le bouton, il affiche toujours le "premier a". La définition pour User.java est:
public class User extends BaseObservable{
private String firstName;
private String lastName;
@Bindable
public String getFirstName(){ return firstName;}
public void setFirstName(String first) {
firstName = first;
notifyPropertyChanged(com.example.ks.myapplication.BR.firstName);
}
@Bindable
public String getLastName(){ return lastName;}
public void setLastName(String last) {
lastName = last;
notifyPropertyChanged(com.example.ks.myapplication.BR.lastName);
}
}
et le XML: Ici, je suis en train d'afficher les changements immédiatement dans les vues de texte et sur le bouton, cliquez aussi.
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.ks.myapplication.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:text="@{user.firstName}" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:text="@{user.lastName}" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button"
android:layout_gravity="center_horizontal"
android:onClick="Click" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
Y at-il quelque chose qui me manque?
votre POJO possède des champs 'private' pour' firstName' et 'lastName' - ne devriez-vous pas utiliser vos méthodes' accessor' et 'mutator'? Je n'ai jamais utilisé de liaison de données XML auparavant, mais il me semble mauvais si vous pouvez accéder à des champs privés. –
Ceci est voulu. Source: http://developer.android.com/tools/data-binding/guide.html –
Si vous regardez bien, ce sont des variables 'public' dans le lien de l'exemple, pas des variables' private' selon votre POJO? Il explique que vous devez utiliser des méthodes 'accessor' si vous utilisez des champs' private'. –