Android Jetpack -- ViewModel篇(二)
支持SharedPreference等使用到Application的相关
因为 SharedPreference 需要使用到 Application 来获取到,所以要想配合ViewModel还需要传入Application作为参数,当然,Jetpack已经为我们准备好了
AndroidViewModel:感知应用上下文的ViewModel,它继承自ViewModel。
下面以一个非常简单的实例来说明
因为使用dataBinding以及SharedPreference需要在build.grade中添加依赖
apply plugin: ‘com.android.application‘ android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.example.viewmodelshp" minSdkVersion 19 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt‘), ‘proguard-rules.pro‘ } } dataBinding.enabled true } dependencies { implementation fileTree(dir: ‘libs‘, include: [‘*.jar‘]) implementation ‘androidx.appcompat:appcompat:1.0.2‘ implementation ‘androidx.constraintlayout:constraintlayout:1.1.3‘ testImplementation ‘junit:junit:4.12‘ androidTestImplementation ‘androidx.test.ext:junit:1.1.0‘ androidTestImplementation ‘androidx.test.espresso:espresso-core:3.1.1‘ implementation ‘androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-alpha02‘ implementation ‘androidx.lifecycle:lifecycle-extensions:2.1.0‘ }
构造MyViewModel.java
package com.example.viewmodelshp; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.SavedStateHandle; public class MyViewModel extends AndroidViewModel {//继承AndroidViewModel类 private SavedStateHandle handle; private String key = getApplication().getResources().getString(R.string.data_key); private String shpName = getApplication().getResources().getString(R.string.shp_name); public MyViewModel(@NonNull Application application, SavedStateHandle handle) { super(application); this.handle = handle; if (!handle.contains(key)) { load(); } } public LiveData<Integer> getNumber() { return handle.getLiveData(key); } private void load() { SharedPreferences shp = getApplication().getSharedPreferences(shpName, Context.MODE_PRIVATE); int x = shp.getInt(key, 0); handle.set(key, x); } private void save() { SharedPreferences shp = getApplication().getSharedPreferences(shpName, Context.MODE_PRIVATE); SharedPreferences.Editor editor = shp.edit(); editor.putInt(key, getNumber().getValue()); editor.apply(); } public void add(int x) { handle.set(key, getNumber().getValue() + x); save(); } }
MainActivity.java
package com.example.viewmodelshp; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.databinding.DataBindingUtil; import androidx.lifecycle.SavedStateViewModelFactory; import androidx.lifecycle.ViewModelProviders; import com.example.viewmodelshp.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity { MyViewModel myViewModel; ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); ViewModelProviders.of(this, new SavedStateViewModelFactory(this)).get(MyViewModel.class); binding.setData(myViewModel); binding.setLifecycleOwner(this); } }
布局如下
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="data" type="com.example.viewmodelshp.MyViewModel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:layout_marginRight="8dp" android:layout_marginBottom="8dp" android:text="@{String.valueOf(data.getNumber)}" android:textSize="40sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.35" tools:text="100" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:onClick="@{()->data.add(1)}" android:text="@string/button_plus" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.5" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:onClick="@{()->data.add(-1)}" android:text="@string/button_mius" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.8" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.5" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
在这个例子里通过获取SharedPreference来存储数据,再配合LiveData,SaveStataHandler实现跨越整个App的生命周期同步。