개발/Android

[JAVA] 안드로이드 ViewModel 초간단 예제 (LiveData 안 쓰고)

레란희 2022. 11. 2. 16:07

여기서 말하는 ViewModel은 MVVM의 ViewModel이 아님!

 

ViewModel은 보통 LiveData랑 같이 써서

두개를 따로 다루는 예제는 못봤다 -_- ;;

 

그러다 오늘 예제를 발견해서 따라함ㅋㅋ

 

차근차근 할 거라 우선 ViewModel만 맛보는 예제를 준비했다.

 

코드 언어는 Java고 ViewBinding이나 DataBinding은 사용하지 않았음.

 

 

1. MainActivity.class

public class MainActivity extends AppCompatActivity {

    TextView tvViewModel, tvNormal;
    Button btnPlus, btnMinus;

    CounterViewModel counterViewModel;
    int normalCount = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        counterViewModel = new ViewModelProvider(this).get(CounterViewModel.class);

        tvViewModel = findViewById(R.id.tv_viewmodel);
        tvNormal = findViewById(R.id.tv_normal);
        btnPlus = findViewById(R.id.btn_plus);
        btnMinus = findViewById(R.id.btn_minus);

        btnPlus.setOnClickListener(v-> {
            normalCount++;
            counterViewModel.count++;
            setCountText();
        });

        btnMinus.setOnClickListener(v-> {
            normalCount--;
            counterViewModel.count--;
            setCountText();
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        setCountText();
    }

    private void setCountText() {
        tvViewModel.setText(counterViewModel.count+"");
        tvNormal.setText(normalCount +"");
    }
}

 

2. CounterViewModel

* class를 public으로 하지 않으면 'Cannot create an instance class ...' 라는 RuntimeException이 발생한다.

public class CounterViewModel extends ViewModel {
   int count=0;
}

 

3. activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_minus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="-"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/btn_plus"
        app:layout_constraintTop_toBottomOf="@id/tv_viewmodel"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <Button
        android:id="@+id/btn_plus"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        app:layout_constraintLeft_toRightOf="@id/btn_minus"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/btn_minus"
        app:layout_constraintBottom_toBottomOf="@id/btn_minus"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="VIEW_MODEL"
        android:textColor="@color/purple_500"
        android:textStyle="bold"
        app:layout_constraintLeft_toLeftOf="@id/tv_viewmodel"
        app:layout_constraintRight_toRightOf="@id/tv_viewmodel"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/tv_viewmodel"
        app:layout_constraintVertical_bias="1"/>

    <TextView
        android:id="@+id/tv_viewmodel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textColor="#000"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@id/tv_normal"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="NORMAL"
        android:textColor="@color/purple_500"
        android:textStyle="bold"
        app:layout_constraintLeft_toLeftOf="@id/tv_normal"
        app:layout_constraintRight_toRightOf="@id/tv_normal"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/tv_normal"
        app:layout_constraintVertical_bias="1"/>

    <TextView
        android:id="@+id/tv_normal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textColor="#000"
        app:layout_constraintLeft_toRightOf="@id/tv_viewmodel"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>





</androidx.constraintlayout.widget.ConstraintLayout>

하단의 증감 버튼을 누르면 숫자가 표시된다.

하나는 뷰모델을 이용하였고, 하나는 Activity의 전역변수로 선언하여 사용했다.

증감버튼을 누른 다음 화면을 회전시키거나 하면 ViewModel의 카운트는 그대로 유지되지만

Activity의 전역변수는 다시 초기값으로 돌아가는 것을 확인할 수 있다.