Androidのクイックスタートデータバインディング

はじめに



私は1年ほど前からプロとしてAndroid開発に従事していましたが、それ以前はWindows Phoneで開発していました。バインディングモデルを使用して、ビューモデルのデータをビュー自体にバインドする機会が好きでした。 RXを研究した後、多くのタスクがよりきれいに解決され始め、ビューモデルはビューから完全に分離されました。 彼女はモデルのみで動作し始め、彼女がどのように表示されるかについてまったく気にしませんでした。



Androidでは、コントローラーの最も単純な代表者がほとんどの場合ビューとモデルの両方にフルアクセスできるため、どのビューを表示するかを決定し、純粋にビューのタスクを解決するような厳密さ、アクティビティ、フラグメントに気付きませんでした。 そのため、過去のGoogle IOでAndroidのデータバインディングが登場したというニュースを受け取り、とてもうれしく思いました。







これまでのところ、これはベータ版リリースに過ぎませんが、機能を既にテストし、Googleの開発者が進んでいる方向を確認できます。



開始する



Android Studio 1.3を使用しています。 データバインディングは、Android 2.1以降(APIレベル7以降)をサポートします。



アセンブリには、Gradleの新しいAndroidプラグインが使用されます(バージョン1.3.0-beta1以前が必要です)。 リンクはコンパイル中に解決されるため、Gradle 'com.android.databinding:dataBinder:1.0-rc0'用のプラグインがもう1つ必要です。 バインディングメカニズムがDependencyPropertyおよびRealTimeで深く実装されている同じWindows Phoneとは異なり、Androidでは、この関数はコンパイルおよび追加のコード生成中に通常のプロパティの上にあるかのように実装されます。



したがって、プロジェクトのルートディレクトリにあるbuild.gradleファイルに移動します(プロジェクト全体のGradle設定が含まれています)。 依存関係ブロックに次を挿入します。



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





プラグインを特定のモジュールに接続し、モジュール内にあるbuild.gradleファイルを開きます。 デフォルトでは、app / build.gradleを追加して次の行を追加します。



 apply plugin: 'com.android.databinding'
      
      





レイアウト設定



外部ビューをタグでラップする必要があります
 . 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.



[ ]

[ ]



























All Articles