让ViewModel访问全局资源(关机数据保存)

创建一个名为ViewModelSavedSHP的项目文件
1、界面设计及功能
让ViewModel访问全局资源(关机数据保存)_第1张图片
功能:按“+1”按钮后,文本框内容+1,按“-1”按钮后,文本框内容-1,关机后再打开,数据会保留
2、在build.gradle中添加依赖
让ViewModel访问全局资源(关机数据保存)_第2张图片

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0'

3、在build.gradle中添加buildFeatures
让ViewModel访问全局资源(关机数据保存)_第3张图片

buildFeatures{
            dataBinding = true
        }

4、strings.xml内容

<resources>
    <string name="app_name">ViewModelSHP</string>
    <string name="DATA"> DATA </string>
    <string name="add"> + </string>
    <string name="minus"> - </string>
    <string name="data_key"> DATA_KEY </string>
    <string name="shp_name"> SHP_NAME </string>
</resources>

5、在com.example.viewmodelsavestate下创建新的类MyViewModel

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 {
    SavedStateHandle handle;
    String key = getApplication().getResources().getString(R.string.data_key);
    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);
    }

    public void load() {
        SharedPreferences shp = getApplication().getSharedPreferences(shpName, Context.MODE_PRIVATE);
        int x = shp.getInt(key, 0);
        handle.set(key, x);
    }
    
    public 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();
    }
}

6、打开activity_main.xml的code形式
在第一行代码处右键,点击“显示可用操作”,然后有一个黄色小灯泡出现,点第一个选项
在这里插入图片描述
然后文件会变成如下内容
让ViewModel访问全局资源(关机数据保存)_第4张图片
在data之间添加如下内容

<data>
            <variable
                name="data"
                type="com.example.viewmodelshp.MyViewModel" />
    </data>

下方TextView中的android:text="内容"修改为

android:text="@{String.valueOf(data.getNumber())}"

第一个Button中添加一行代码

android:onClick="@{()->data.add(1)}"

第二个Button中添加一行代码

android:onClick="@{()->data.add(-1)}"

7、打开MainActivity.java文件

package com.example.viewmodelshp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.SavedStateViewModelFactory;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import com.example.viewmodelshp.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    ActivityMainBinding binding;
    MyViewModel myViewModel;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        myViewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(MyViewModel.class);
        binding.setData(myViewModel);
        binding.setLifecycleOwner(this);
    }
}

8、结束

你可能感兴趣的:(Android学习)