dependencies { classpath 'com.android.tools.build:gradle:1.3.0-beta2' classpath 'com.android.databinding:dataBinder:1.0-rc0' }
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.
[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding
: View Id .
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>
Binding , findViewById. MainActivity onCreate:
ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .
, Layout MVVM # Windows . Java RX, .
.
public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :
binding.setUser(new User("Some name", 27));
. .
:
someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :
public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:
<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :
<import type="android.view.View"/>
:
android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:
<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"
. :
public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:
public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:
<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:
<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .
, :
binding.setUser(new User("New model", 668714400L, false));
, :
User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);
public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable
. Layout android:text="@{user.name}", isAdult adult, c 'is' . .
ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:
public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .
, Map:
<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:
public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }
MainActivity:
public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:
<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.
- .
Data Binding Android Google. , . JavaRX.
[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding
: View Id .
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>
Binding , findViewById. MainActivity onCreate:
ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .
, Layout MVVM # Windows . Java RX, .
.
public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :
binding.setUser(new User("Some name", 27));
. .
:
someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :
public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:
<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :
<import type="android.view.View"/>
:
android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:
<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"
. :
public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:
public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:
<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:
<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .
, :
binding.setUser(new User("New model", 668714400L, false));
, :
User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);
public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable
. Layout android:text="@{user.name}", isAdult adult, c 'is' . .
ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:
public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .
, Map:
<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:
public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }
MainActivity:
public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:
<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.
- .
Data Binding Android Google. , . JavaRX.
[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding
: View Id .
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>
Binding , findViewById. MainActivity onCreate:
ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .
, Layout MVVM # Windows . Java RX, .
.
public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :
binding.setUser(new User("Some name", 27));
. .
:
someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :
public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:
<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :
<import type="android.view.View"/>
:
android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:
<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"
. :
public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:
public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:
<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:
<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .
, :
binding.setUser(new User("New model", 668714400L, false));
, :
User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);
public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable
. Layout android:text="@{user.name}", isAdult adult, c 'is' . .
ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:
public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .
, Map:
<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:
public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }
MainActivity:
public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:
<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.
- .
Data Binding Android Google. , . JavaRX.
[ ]
[ ]
. C ; , . . . main_activity - MainActivityBinding, , com.georgeci.bindingssample.databinding.ActivityMainBinding
: View Id .
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="user" type="com.georgeci.bindingssample.User"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/bindTv" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout> </layout>
Binding , findViewById. MainActivity onCreate:
ActivityMainBinding binder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); binding.bindTv.setText("Some text"); }
Id View, Id , Id View, . CTRL View, . .
, Layout MVVM # Windows . Java RX, .
.
public class User { public String name; public int age; public User(String name, int age) { this.nam = name; this.age = age; } }
Layout, LinearLayout :
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.name}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(user.age)}"/>
onCreate :
binding.setUser(new User("Some name", 27));
. .
:
someView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
. :
public class User { public String name; public int age; public User(String name, int age, boolean isAdult) { this.name = name; this.age = age; this.isAdult = isAdult; } public boolean isAdult; }
Layout:
<TextView android:id="@+id/adult_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="@{user.isAdult ?View.VISIBLE :View.GONE}" android:text="Some content only for adult"/>
.
View, , :
<import type="android.view.View"/>
:
android:visibility="@{user.isAdult ? android.view.View.VISIBLE : android.view.View.GONE}"
:
<import type="android.view.View" alias="SomeAlias"/> ... android:visibility="@{user.isAdult ? SomeAlias.VISIBLE : SomeAlias.GONE}"
. :
public class User { public String name; public long birthday; public boolean isAdult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.isAdult = isAdult; } }
:
public class UnixDateConverter { public static String convert(long timestamp) { Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp * 1000); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); return sdf.format(mydate.getTime()); } }
:
<import type="com.georgeci.bindingssample.UnixDateConverter"/> ... <TextView android:id="@+id/birthday" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{UnixDateConverter.convert(user.birthday)}"/>
Binding
.
Layout:
<variable name="clicker" type="android.view.View.OnClickListener"/> ... <Button android:text="Some button" app:onClickListener="@{clicker}" android:layout_width="match_parent" android:layout_height="wrap_content"/>
onCreate:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); final User user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "ckick!", Toast.LENGTH_SHORT).show(); user.name="from btn"; } }); }
, , . - , binder .
, :
binding.setUser(new User("New model", 668714400L, false));
, :
User user1 = binding.getUser(); user1.name = "old model"; binding.setUser(user1);
View, . binder, . , , Android Studio Alt-Insert -> Getter and Setter -> Ctrl-A -> Enter
@Bindable, notifyPropertyChanged(BR.lastName);
public class User extends BaseObservable { private String name; private long birthday; private boolean adult; public User(String name, long birthday, boolean isAdult) { this.name = name; this.birthday = birthday; this.adult = isAdult; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(com.georgeci.bindingssample.BR.name); } @Bindable public long getBirthday() { return birthday; } public void setBirthday(long birthday) { this.birthday = birthday; notifyPropertyChanged(com.georgeci.bindingssample.BR.birthday); } @Bindable public boolean isAdult() { return adult; } public void setAdult(boolean adult) { this.adult = adult; notifyPropertyChanged(com.georgeci.bindingssample.BR.adult); } }
BR, , @Bindable
. Layout android:text="@{user.name}", isAdult adult, c 'is' . .
ObservableFields
android.databinding , binder :
ObservableField<T> ObservableArrayMap<K, V> ObservableArrayList<T>
:
public class User extends BaseObservable { @Bindable public final ObservableField<String> name = new ObservableField<>(); @Bindable public final ObservableLong birthday = new ObservableLong(); @Bindable public final ObservableBoolean adult = new ObservableBoolean(); public User(String name, long birthday, boolean isAdult) { this.name.set(name); this.birthday.set(birthday); this.adult.set(isAdult); } }
? . final, , ; .
, Map:
<TextView android:text='@{user["lastName"]}' android:layout_width="wrap_content" android:layout_height="wrap_content"/>
View Model
UI, EditText . EditText Editable, ObservableField. ? MVVM. SimpleViewMode:
public class Vm extends BaseObservable { @Bindable public final ObservableField<Editable> edit = new ObservableField<>(); public Vm() { this.edit.set(Editable.Factory.getInstance().newEditable("")); } }
MainActivity:
public class MainActivity extends AppCompatActivity { User user; ActivityMainBinding binding; Vm vm = new Vm(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); user = new User("Some name", 668714400L, false); binding.setUser(user); binding.setVm(vm); binding.setClicker(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), vm.edit.get().toString(), Toast.LENGTH_SHORT).show(); } }); } }
:
<EditText android:id="@+id/edit_text" android:layout_width="match_parent" android:text="@{vm.edit}" android:layout_height="wrap_content"/>
, ObservableField EditText, View. , , Editable, ObservableField, , EditText.
- .
Data Binding Android Google. , . JavaRX.
[ ]
[ ]
Source: https://habr.com/ru/post/260317/
All Articles