JetPack
Jetpack是一套庫、工具和指導,可以幫助開發人員更輕松地編寫高質量的應用程序。這些組件幫助您遵循最佳實踐,將您從編寫樣板代碼中解放出來,並簡化復雜的任務,這樣您就可以專注於您關心的代碼了
ViewModel&LiveData
ViewModel類被設計成以生命周期的方式存儲和管理ui相關的數據。ViewModel類允許數據在配置更改(如屏幕旋轉)后仍然存在。
LiveData是一個可觀察的數據持有者類。與常規的可觀察對象不同,LiveData是生命周期感知的,這意味着它尊重其他應用程序組件的生命周期,比如活動、片段或服務。這種意識確保LiveData只更新處於活動生命周期狀態的應用程序組件觀察者。
public class MyViewModelWithLiveData extends ViewModel {
// 數據
private MutableLiveData<Integer> likeNumber;
public MutableLiveData<Integer> getLikeNumber() {
if (likeNumber == null){
likeNumber = new MutableLiveData<>();
likeNumber.setValue(0);
}
return likeNumber;
}
public void addLikeNumber(int add){
likeNumber.setValue(likeNumber.getValue()+add);
}
}
監聽數據改變
mModelWithLiveData = new ViewModelProvider(this).get(MyViewModelWithLiveData.class);
mModelWithLiveData.getLikeNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
//改變界面數據
mTextView.setText(String.valueOf(integer));
}
});
DataBinding
數據綁定庫是一個支持庫,允許您使用聲明格式(而不是編程方式)將布局中的UI組件綁定到應用程序中的數據源。
在當前模塊下的gradle文件下添加如下配置
android {
...
dataBinding {
enabled = true
}
}
用layout包裝原布局代碼
variable字段中name可以理解為ViewModel的實例對象,type指定ViewModel類
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="data"
type="com.example.collectiondemoandroid.MyViewModelWithLiveData"/>
</data>
<LinearLayout
......
</LinearLayout>
</layout>
- 綁定值
<TextView
android:id="@+id/textView"
android:text="@{String.valueOf(data.likeNumber)}"
/>
- 綁定方法
<ImageButton
android:id="@+id/upButton"
android:onClick="@{()->data.addLikeNumber(2)}"
/>
綁定視圖
'ActivityMainBinding' 命名方式為layout的名稱加Binding
ActivityMainBinding dataBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
// 獲取控件 dataBinding.upButton
//獲取viewmodel對象
mModelWithLiveData = new ViewModelProvider(this).get(MyViewModelWithLiveData.class);
//設置數據
dataBinding.setData(mModelWithLiveData);
//設置監聽
dataBinding.setLifecycleOwner(this);
}
Saved State module for ViewModel
當應用被系統Kill下次直接恢復上次的數據
使用也很簡單,其實只需要將上面的MyViewModelWithLiveData進行如下的修改就行
- SavedStateHandle對象管理數據
- 添加構造函數傳入 SavedStateHandle對象
SavedStateHandle方法如下
- get(String key)
- contains(String key)
- remove(String key)
- set(String key, T value)
- keys()
- getLiveData()
public class MyViewModelWithLiveData extends ViewModel {
final public static String LIKEKEY = "likenumber";
private SavedStateHandle mSavedStateHandle;
//構造函數
public MyViewModelWithLiveData(SavedStateHandle savedStateHandle){
mSavedStateHandle = savedStateHandle;
}
public MutableLiveData<Integer> getLikeNumber() {
if (!mSavedStateHandle.contains(LIKEKEY)){
mSavedStateHandle.set(LIKEKEY,0);
}
//以LiveData的形式去除
return mSavedStateHandle.getLiveData(LIKEKEY);
}
public void addLikeNumber(int add){
getLikeNumber().setValue(getLikeNumber().getValue()+add);
}
}