📜 ⬆️ ⬇️

Quick start Data Binding in Android

Introduction


I have been professionally working on android-development for a little over a year, before that I developed it on Windows Phone and I liked the ability to link data from a model view to the View itself using the Bindings mechanism. And after studying the RX, many tasks began to be solved more purely, the view model completely separated from View. She began to operate only on the model, not caring at all about how it would be displayed.

In Android, I did not notice such rigor, Activity or Fragment as the simplest representatives of the controller most often have full access to both the View and the model, often deciding which View will be visible, thus solving purely viewing tasks. Therefore, I rather happily accepted the news about the appearance of Data Binding in Android on the past Google IO.


')
So far this is only a beta release, but you can already test the functionality and see the direction in which developers from Google are moving.

Start


I am using Android Studio 1.3. Data binding supports Android 2.1 and higher (API level 7+).

For the assembly, a new android plugin for Gradle is used (version 1.3.0-beta1 and later is needed). Since the links are processed during compilation, we need another plugin to Gradle 'com.android.databinding: dataBinder: 1.0-rc0'. Unlike Windows Phone, where the binding mechanism is implemented deeply by means of DependencyProperty and in RealTime, in Android this function is implemented as if over normal properties, during compilation and additional code generation, therefore in case of errors, be prepared to parse the response from the compiler.

So, go to the file build.gradle, which lies in the root directory of the project (there are settings Gradle for the entire project). In the block dependencies, insert:

dependencies { classpath 'com.android.tools.build:gradle:1.3.0-beta2' classpath 'com.android.databinding:dataBinder:1.0-rc0' } 

Now let's connect the plugin to a specific module, open the build.gradle file that lies inside the module. By default, app / build.gradle and add the line:

 apply plugin: 'com.android.databinding' 

Layout Setup


We have to wrap our external view in a tag.
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>
:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
 . C            ;  ,     .         .            .  main_activity - MainActivityBinding,       ,   com.georgeci.bindingssample.databinding.ActivityMainBinding 

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding

: View Id .

<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>

Binding , findViewById. MainActivity onCreate:

ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .

, Layout MVVM # Windows . Java RX, .


.

public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :

<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :

binding.setUser(new User("Some name", 27));
. .
:

someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :

public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:

<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :

<import type="android.view.View"/>

:

android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:

<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"


. :

public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:

public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:

<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:

<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .

, :

binding.setUser(new User("New model", 668714400L, false));
, :

User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);

public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable . Layout android:text="@{user.name}", isAdult adult, c 'is' . .

ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:

public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .

, Map:

<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:

public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }

MainActivity:

public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:

<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.

- .


Data Binding Android Google. , . JavaRX.

[ ]
[ ]

Source: https://habr.com/ru/post/260317/


All Articles