案例一:双向绑定(DataBinding + ViewModel)
实体类
public class User {
public String name;
public User(String name) {
this.name = name;
}
}
Activity
public class FourDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityFourBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_four);
binding.setUserViewModel(new UserViewModel());
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="userViewModel"
type="包名.UserViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical">
<EditText
android:id="@+id/et_text"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="@={userViewModel.userName}"
android:layout_marginTop="20dp"/>
</LinearLayout>
</layout>
- ViewModel(第一种方式)
public class UserViewModel extends BaseObservable {
private User user;
public UserViewModel() {
user = new User("henry");
}
@Bindable
public String getUserName() {
return user.name;
}
public void setUserName(String name) {
if (!TextUtils.isEmpty(name) && !name.equals(user.name)) {
user.name = name;
notifyPropertyChanged(BR.userName);
}
}
}
- ViewModel(第二种方式)
public class UserViewModel {
private ObservableField<User> field;
public UserViewModel() {
User user = new User("Henry");
field = new ObservableField<>();
field.set(user);
}
public String getUserName() {
return field.get().name;
}
public void setUserName(String name) {
if (!TextUtils.isEmpty(name) && !name.equals(field.get().name)) {
field.get().name = name;
}
}
}
案例二:实现比赛记分器(DataBinding + ViewModel + LiveData)
Activity
public class SevenDataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivitySevenBinding binding = DataBindingUtil.setContentView(this,
R.layout.activity_seven);
ScoreViewModel viewModel = new ViewModelProvider(this,
new ViewModelProvider.AndroidViewModelFactory(getApplication()))
.get(ScoreViewModel.class);
binding.setViewModel(viewModel);
binding.setLifecycleOwner(this);
}
}
ViewModel
public class ScoreViewModel extends ViewModel {
public MutableLiveData<Integer> ascore;
public MutableLiveData<Integer> bscore;
public MutableLiveData<Integer> getAscore() {
if (ascore == null) {
ascore = new MutableLiveData<>();
ascore.setValue(0);
}
return ascore;
}
public MutableLiveData<Integer> getBscore() {
if (bscore == null) {
bscore = new MutableLiveData<>();
bscore.setValue(0);
}
return bscore;
}
public void aplus(int score) {
ascore.setValue(ascore.getValue() + score);
}
public void bplus(int score) {
bscore.setValue(bscore.getValue() + score);
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="com.zc.mydemo.jetpack.databind.demo7.ScoreViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".jetpack.databind.demo7.SevenDataActivity">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/ascore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textSize="30sp"
android:textColor="@color/colorPrimary"
android:text="@{String.valueOf(viewModel.getAscore())}" />
<Button
android:id="@+id/aone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{()->viewModel.aplus(1)}"
android:text="加一分" />
<Button
android:id="@+id/atwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{()->viewModel.aplus(2)}"
android:text="加两分" />
<Button
android:id="@+id/athree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{()->viewModel.aplus(3)}"
android:text="加三分" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/bscore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textSize="30sp"
android:textColor="@color/colorPrimary"
android:text="@{String.valueOf(viewModel.getBscore())}" />
<Button
android:id="@+id/bone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{()->viewModel.bplus(1)}"
android:text="加一分" />
<Button
android:id="@+id/btwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{()->viewModel.bplus(2)}"
android:text="加两分" />
<Button
android:id="@+id/bthree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:onClick="@{()->viewModel.bplus(3)}"
android:text="加三分" />
</LinearLayout>
</LinearLayout>
</layout>