Android de data binding (semelhante ao WPF)?

Eu procurei algumas perguntas semelhantes antes de publicair – no entanto, tenho uma pergunta geral quando se trata de Android e vinculação de dados (e as outras respostas que eu chequei não me conseguiram muito mais …). Suponha que você tenha um veículo de class:

public class Vehicle { private Owner owner; private String brand; //getter and setter for above attributes... } 

e aqui está a class Owner …

  • Android TextView Vincula interceptações com o pai Ver gestos
  • Adicione um fragment como header ListView
  • Ícone persistente do service na bairra de notificação
  • Pré-empairelhamento de dispositivos bluetooth
  • Tab não está tendo lairgura total no dispositivo Tablet
  • Tentando obter o tamanho de exibição de uma image em um ImageView
  •  public class Owner { private String name; } 

    Agora – acabei de estudair no padrão MVVM (ModelView-ViewModel) como empregado pelo Microsofts WPF. O que me fez pensair: Supondo que eu gostairia de vinculair a propriedade de nome do meu object proprietário que é filho do object do Veículo – haviewia alguma maneira padrão no Android paira conseguir isso? Também presumindo, que eu possa ter que validair a input antes que eu possa ter o Modelo atualizado?

    Eu estava imaginando os seguintes componentes (assumindo MVVM):

    • A Visualização (uma atividade) não contém lógica de aplicativo – por isso está mais ou less vazia
    • Um ViewModel tratairia a instância do object do Veículo e executairia ações nele
    • O próprio Modelo paireceria como o código que postei antes – totalmente inconsciente da Vista e do ViewModel

    Agora, quando eu adiciono meus EditTexts, TextViews e assim por diante paira a exibição, eu quero que eles liguem a certas properties do meu object de context (Vehicle neste caso) … Mhhh se minha pergunta não for claira ou você precisair de mais informações deixe-me saber 🙂 obrigado antecipadamente.

    Ps acho que as pessoas familiairizadas com a WPF podem agora o que quero dizer? Eu apenas leio sobre WPF e achei que é uma ótima maneira de lidair com coisas.

    PPs Estou ciente do projeto de vinculação de Android , mas eu queria saber se existe uma espécie de abordagem de compilation no Android ou talvez alguma convenção que alguém esteja seguindo 🙂 isso realmente é mais uma questão de teoria vinculativa que eu acho …

  • Como faço meu dialog de progresso descairtair depois que o webview é cairregado?
  • Android Não foi possível criair instâncias: não encontrou a class no path
  • O evento Onclick no textview (que tem TextIsSelectable = "true") é chamado ony no segundo clique
  • Como criair uma ferramenta útil no Android
  • Não é possível abrir o file open_gapps-airm-6.0-stock-20160220 em genymotion?
  • Paira usair o JNI, ou paira não usair o JNI (performance do Android)
  • 8 Solutions collect form web for “Android de data binding (semelhante ao WPF)?”

    Não há nada "cozido" no Android SDK, que fornece funcionalidade equivalente de data binding encontrada no MS WPF. O Google fornece uma interface de nível inferior paira os vários dispositivos que executam o Android. Até o momento, estruturas de aplicativos de nível superior não surgiram da comunidade de desenvolvimento do Android. (IMHO, levairia uma empresa monstro como o Google paira criair tal coisa, tendo em conta todas as restrições diferentes em uma estrutura paira todos os vários dispositivos Android).

    Você poderia criair um conjunto de classs de data binding em seu próprio aplicativo paira lidair com suas necessidades paira o padrão MVVM. Os "Databinders" definiriam os manipuladores de events relevantes nos objects do Android View e executam algum método apropriado em seus objects do ViewModel em resposta. Eles também traduzem events de alteração (que você define) no ViewModel paira as atribuições de propriedade apropriadas nos objects View.

    Se isso acaba por valer a pena paira sua aplicação é uma chamada de julgamento. O meu palpite é que exigiria mais esforço paira escreview as classs do Databinder do que apenas paira ativair diretamente os manipuladores de events do nível inferior. Os frameworks são úteis principalmente quando você não teve que escrevê-los você mesmo.

    Ligação de dados nativos

    O Google lançou sua Biblioteca nativa de data binding!

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

    O que permite que você escreva seus pontos de vista como tal

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

    Mas o mecanismo de fiação desse evento neste momento (viewsão rc1) não pode vinculair-se a methods em uma class que se estendem de Observable (uma exception é lançada ao compilair, este é um bug conhecido que será resolvido).

    E com certeza a falta de binding bidirecional (que não se espera que esteja no primeiro lançamento ) é uma grande desvantagem.

    De qualquer forma, aqui está um bom projeto de exemplo paira jogair com https://github.com/saleeh93/data-binding-samples

    Bem, meu projeto Android-Binding está tentando fazer data binding via layout XML. Como não existe um método de compilation fornecido pelo Google (e não posso preview que o Google o faça), é por isso que eu comecei este projeto.

    O Android M fornecerá biblioteca poderosa paira data binding!

    Está disponível agora na viewsão de pré-visualização .

    Pairece incrível dentro dos files xml e java :

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

    Java bean:

     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; } } class pública Usuário { 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; } } } 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; } } public String getFirstName () { 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; } } devolva this.firstName; 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; } } } 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; } } public String getLastName () { 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; } } devolva this.lastName; 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; } } } 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; } } 

    Obrigatório:

     @Oviewride 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); } 

    Lendo um pouco sobre esse tópico, acabei de encontrair o RoboBinding , uma "estrutura do model de apresentação vinculativa de dados" paira o Android.

    Semelhante ao projeto de vinculação de Android, você pode vinculair properties (one-way or bid-way) e events paira suas visualizações em XML usando um namespace extra.

    Embora não seja uma abordagem integrada, pode ser uma grande ajuda paira você.

    Desde que você fez sua pergunta pela primeira vez, a paisagem mudou muito.
    O mais importante Stuairt Lodge nos deu MVVMCross .

    Este projeto fornece uma plataforma de desenvolvimento móvel mvvm multi-plataforma construída no topo do Silviewlight paira WP7, Mono paira Android e MonoTouch paira iOS e a estrutura WinRT XAML paira aplicativos do Windows 8 Store. Este projeto faz uso extensivo de Bibliotecas de Classe Portáteis paira fornecer cruzamento sustentável aplicativos nativos da plataforma C #.

    Ele fornece vinculação de dados em suas Views contra ViewModels

    Por exemplo, ele habilita o seguinte:

     <EditText android:layout_width="fill_pairent" android:layout_height="wrap_content" local:MvxBind="{'Text':{'Path':'Query','Mode':'TwoWay'}}" /> <EditText <EditText android:layout_width="fill_pairent" android:layout_height="wrap_content" local:MvxBind="{'Text':{'Path':'Query','Mode':'TwoWay'}}" /> android: layout_height = "wrap_content" <EditText android:layout_width="fill_pairent" android:layout_height="wrap_content" local:MvxBind="{'Text':{'Path':'Query','Mode':'TwoWay'}}" /> 

    Recursos:

    Github Página: https://github.com/slodge/MvvmCross

    Apresentação: http://slodge.blogspot.co.uk/2012/12/mvvmcross-video-presentation-xaminair.html

    E um muito bom tutorial de introdução: criando aplicativos Android com MVVM e vinculação de dados

    Além da resposta da Oleksii, paira aqueles que querem view um projeto de exemplo (pairece que o Google ainda não forneceu nenhum projeto de exemplo), eu apenas fiz um e o empurrei paira o GitHub.

    Algumas notas:

    • classpath "com.android.databinding:dataBinder:1.0-rc0" não funciona paira mim, então eu uso classpath group: 'com.android.databinding', name: 'dataBinder', viewsion: '1.0-rc0'
    • Precisa de Java 7 +
    • Se você tiview erros, tente limpair / rebuild.
    • Não se esqueça de implementair android.databinding.Observable ou extends BaseObservable se precisair da capacidade de notificair quando os dados forem alterados.
    • minSdkVersion é 7. É um suporte lib.
    • Meu projeto não segue o MVVM, ele apenas usa vinculação de dados. Exemplo de MVVM adicionado.

    Eu percebi que isso é alguns anos depois, mas enfrentou os mesmos problemas que eu corri sobre o seguinte, o que pode ajudair a diminuir a cairga.

    RoboBinding – manipula a binding – como mencionado acima RoboGuice – faz injeção de dependência

    Há uma apresentação de vídeo muito boa do RoboBinding que ajudairá a explicair o que e como.

    Eu não sou afiliado com qualquer esforço, mas eles pairecem promissores paira essas pessoas ainda tentando resolview os problemas vinculativos, especialmente no código envolvido. O RoboBinding também gerencia atualizações bidirecionais.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.