Android---AndroidViewModel

19580 단어 Android
Android ViewModel은 시스템에서 제공하는 클래스이며 ViewMode의 하위 클래스입니다.
AndroidViewModel 은 향후 소개될 예정입니다.간단한 sp 수치 저장 동작을 만듭니다.우리가 프로그램을 끄고 다시 열면 수치가 다시 나타납니다
SharedPreferences는 Context를 상속하는 인터페이스이기 때문입니다.그래서 대상을 얻으려면 context가 필요합니다.
AndroidViewModel:
public class MyViewModel extends AndroidViewModel {

    SavedStateHandle handle;
    String key = getApplication().getResources().getString(R.string.data_key);
    String spName = getApplication().getResources().getString(R.string.sp_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 sp = getApplication().getSharedPreferences(spName, Context.MODE_PRIVATE);
        int x = sp.getInt(key, 0);
        handle.set(key, x);
    }

    public void save() {
        SharedPreferences sp = getApplication().getSharedPreferences(spName, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.putInt(key, getNumber().getValue());
        edit.apply();
    }

    public void add(int x) {
        handle.set(key, getNumber().getValue() + x);
    }
}


java:
    private MyViewModel viewModel;
    private ActivityViewModelTestBinding bindingBinding;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bindingBinding= DataBindingUtil.setContentView(this, R.layout.activity_view_model_test);
        viewModel=new ViewModelProvider(this).get(MyViewModel.class);
        bindingBinding.setData(viewModel);//.setXxx(yyy)。Xxx       data   name
        bindingBinding.setLifecycleOwner(this);//      ,           
    }

    @Override
    protected void onPause() {
        super.onPause();
        viewModel.save();
    }

xml:
<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.viewmodeltest.MyViewModel" />
    data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(data.getNumber)}"/>

        <Button
            android:id="@+id/btn_one"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{()->data.add(1)}"
            android:text="@string/add"/>

        <Button
            android:id="@+id/btn_two"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{()->data.add(-1)}"
            android:text="@string/sub"/>
    LinearLayout>
layout>

위의 Adnroid View 모델 중 이save 방법을 어디서 실행하는 것이 좋을지 생각해 볼 필요가 있습니다.

좋은 웹페이지 즐겨찾기