2

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?

+0

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. –

+0

Ceci est voulu. Source: http://developer.android.com/tools/data-binding/guide.html –

+0

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'. –

Répondre