Andriod — JetPack :初识 JetPack
Andriod — JetPack :LifeCycle 的诞生
Andriod — JetPack :ViewModel 的诞生
Andriod — JetPack :BaseObservable 与 ObservableField 双向绑定
Andriod — JetPack :DataBinding + LiveData +ViewModel 简单实例
Andriod — JetPack :Room 增删改查
Andriod — JetPack :Room + ViewModel + LiveData 增删改查实例
Andriod — JetPack :LiveData setValue 和 postValue 的区别
一、DataBinding1.让布局页面承担了部分原本属于页面的工作,是页面文件和布局耦合度进一步降低。页面文件:Activity。布局:activity_main.xml
2.减少了很多 findViewById 与 OnClickListener 布局文件可以包含一些简单的业务逻辑
在 ViewModel 中的数据发生变化时通知页面 LiveData 与 ObservableField 同样可以实现双向绑定 这里的 Model 层下面的例子未呈现,等过后学到了 JetPack - Room 自然就懂了
1.它是介于 View(视图)和 Model(数据模型)直接的桥梁 2.使视图和数据能够分离,也能够保持通信 https://blog.csdn.net/qq_43290288/article/details/123478346
四:DataBinding + LiveData +ViewModel 实例在 build.gradle 中添加 DataBinding 支持
android {
dataBinding {
enabled = true
}
}
自定义MyViewModel.java
import android.view.View;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData aTeamScore;
private MutableLiveData bTeamScore;
public MutableLiveData getaTeamScore() {
if(aTeamScore == null) {
aTeamScore = new MutableLiveData();
aTeamScore.setValue(0);
}
return aTeamScore;
}
public MutableLiveData getbTeamScore() {
if(bTeamScore == null) {
bTeamScore = new MutableLiveData();
bTeamScore.setValue(0);
}
return bTeamScore;
}
public void aTeamAdd(View view) {
aTeamScore.setValue(aTeamScore.getValue() + 1);
}
public void bTeamAdd() {
bTeamScore.setValue(bTeamScore.getValue() + 1);
}
}
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import android.database.DatabaseUtils;
import android.os.Bundle;
import com.example.mvvm20220312.databinding.ActivityMainBinding;
import com.example.mvvm20220312.viewmodel.MyViewModel;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); // ActivityMainBinding 对应 activity_main.xml
MyViewModel viewModel = new ViewModelProvider(this, new ViewModelProvider.AndroidViewModelFactory(getApplication())).get(MyViewModel.class);
binding.setViewModel(viewModel); // DataBinding 与 ViewModel 绑定
binding.setLifecycleOwner(this); // 要想在绑定类中使用 LiveData 对象,我们需要指定生命周期所有者来定义 LiveData 对象的范围。在绑定类实例化后指定 activity 作为生命周期所有者
}
}
activity_main.xml
在使用MVVM模式时,Fragment可以作为视图(View)的一部分来展示数据和处理用户交互。下面是一种在Fragment中使用MVVM的方法:
创建模型(Model):与上述提到的模型相同,定义数据类或业务逻辑类。
创建视图模型(ViewModel):继承自Android中的ViewModel类,负责处理数据和业务逻辑。
java
public class MyViewModel extends ViewModel { private MutableLiveData data = new MutableLiveData();
public void setData(String newData) {
data.setValue(newData);
}
public LiveData getData() {
return data;
}
}
创建Fragment:作为视图(View)的一部分,负责展示数据和处理用户交互。
java
public class MyFragment extends Fragment { private MyViewModel viewModel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// 创建和设置视图
// 使用数据绑定将viewModel与视图绑定
FragmentMyBinding binding = FragmentMyBinding.inflate(inflater, container, false);
binding.setLifecycleOwner(this);
binding.setViewModel(viewModel);
return binding.getRoot();
}
}
XML布局文件中使用数据绑定:通过@{}来绑定视图与视图模型中的数据和命令。
xml
在上述代码中,我们创建了一个视图模型MyViewModel,它具有setData()方法来更新数据和getData()方法供视图获取数据。然后,在Fragment的onCreateView()方法中,我们使用数据绑定将视图模型与布局文件进行绑定。
这样,当视图模型中的数据发生变化时,布局文件中对应的数据也会自动更新,从而保持视图与数据的同步。
通过使用MVVM模式和数据绑定,我们能够更好地分离视图与业务逻辑,并提高代码的可测试性和重用性。同时,使用Fragment作为视图的一部分,能够更方便地管理用户交互和界面切换。