33 votes

Liaison de données Android (similaire à WPF) ?

J'ai cherché des questions similaires avant de poster - mais j'ai une question générale concernant Android et la liaison de données (et les autres réponses que j'ai vérifiées ne m'ont pas vraiment fait avancer...). Supposons que vous ayez une classe Véhicule :

public class Vehicle {

private Owner owner;
private String brand;

//getter and setter for above attributes...

}

et voici la classe Propriétaire ....

public class Owner {

private String name;

}

J'ai récemment étudié le modèle MVVM (ModelView-ViewModel) tel qu'il est utilisé par Microsofts WPF. Ce qui m'a amené à me demander : En supposant que je veuille lier la propriété du nom de mon objet propriétaire qui est un enfant de l'objet véhicule, y aurait-il un moyen standard dans Android pour y parvenir ? En supposant également que je doive valider l'entrée avant de pouvoir mettre à jour le modèle ?

J'imaginais les composants suivants (en supposant MVVM) :

  • La vue (une activité) ne contient aucune logique d'application - elle est donc plus ou moins vide.
  • Un ViewModel manipulerait l'instance de l'objet Véhicule et effectuerait des actions sur celle-ci.
  • Le Modèle lui-même ressemblerait au code que j'ai posté auparavant - totalement inconscient de la Vue et du ViewModel

Maintenant, lorsque j'ajoute mes EditTexts, TextViews et ainsi de suite à la vue, je veux qu'ils se lient à certaines propriétés de mon objet de contexte (véhicule dans ce cas) .... Si ma question n'est pas claire ou si vous avez besoin de plus d'informations, faites-le moi savoir :) merci d'avance.

P.s. Je pense que les personnes familières avec WPF peuvent comprendre ce que je veux dire ? Je viens moi-même de me documenter sur WPF et je trouve que c'est une bonne façon de gérer les choses.

P.P.s Je suis au courant de la Liaison Android mais je me demandais s'il y avait une sorte d'approche intégrée dans Android ou peut-être une convention que quelqu'un suit :) c'est vraiment plus une question de théorie de liaison je suppose ...

25voto

Minelli Points 420

Liaison de données en mode natif

Google a lancé sa bibliothèque native de liaison de données !

https://developer.Android.com/tools/data-binding/guide.html

Ce qui vous permet d'écrire vos vues comme suit

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

Mais son mécanisme de câblage d'événements ne peut pas, pour l'instant (version rc1), se lier aux méthodes d'une classe s'étendant à partir d'Observable (une exception est levée lors de la compilation ; il s'agit d'une bug connu qui sera résolu).

Et bien sûr, l'absence de liaison bidirectionnelle (qui ne devrait pas figurer sur la liste de l'UE) est un problème. première version ) est un gros inconvénient.

Quoi qu'il en soit, voici un bon exemple de projet avec lequel vous pouvez jouer. https://github.com/saleeh93/data-binding-samples

14voto

randomfactor Points 373

Il n'y a rien d'intégré dans le SDK Android qui fournisse une fonctionnalité de liaison de données équivalente à celle de MS WPF. Google fournit une interface de niveau inférieur pour les différents appareils fonctionnant sous Android. À ce jour, aucun cadre d'application de niveau supérieur n'a émergé de la communauté de développement Android. (IMHO, il faudrait une entreprise monstrueuse comme Google pour créer une telle chose, étant donné toutes les différentes contraintes sur un cadre pour tous les divers appareils Android).

Vous pourriez créer un ensemble de classes de liaison de données dans votre propre application pour répondre à vos besoins en matière de modèle MVVM. Les "Databinders" définiraient les gestionnaires d'événements pertinents sur les objets Android View et exécuteraient en réponse une méthode appropriée sur vos objets ViewModel. Ils traduisent également les événements de changement (que vous définissez) sur le ViewModel en affectations de propriétés appropriées sur les objets View.

C'est à vous de décider si cela vaut la peine pour votre application. Je pense que l'écriture des classes Databinder demanderait plus d'efforts que le simple fait d'accrocher directement les gestionnaires d'événements View de niveau inférieur. Les frameworks sont utiles principalement lorsque vous n'avez pas à les écrire vous-même.

14voto

xandy Points 13480

Eh bien, mon Liaison avec Android tente d'établir des liens entre les données par le biais d'une mise en page XML. Comme il n'y a pas de méthode intégrée fournie par Google (et je ne peux pas prévoir que Google le fera), c'est la raison pour laquelle j'ai commencé ce projet.

11voto

Oleksii Kropachov Points 1698

Android M fournira une bibliothèque puissante pour la liaison de données !

Il est disponible dès maintenant dans version dev-preview .

L'intérieur est magnifique. xml et java des fichiers :

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

Un haricot Java :

public class User {
   private final String firstName;
   private final String lastName;
   public User(String firstName, String lastName) {
       this.firstName = firstName;
       this.lastName = lastName;
   }
   public String getFirstName() {
       return this.firstName;
   }
   public String getLastName() {
       return this.lastName;
   }
}

Reliure :

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
   User user = new User("Test", "User");
   binding.setUser(user);
}

8voto

saschoar Points 2433

En lisant un peu sur ce sujet, je viens de trouver RoboBinding un "cadre de modèle de présentation lié aux données" pour Android.

Comme pour le projet Android-binding, vous pouvez lier des propriétés (unidirectionnelles ou bidirectionnelles) et des événements à vos vues en XML en utilisant un espace de nom supplémentaire.

Bien qu'il ne s'agisse pas non plus d'une approche intégrée, elle pourrait vous être d'une grande aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X