728x90
오늘은 viewmodel을 활용해 구성변경에도 데이터를 유지하는 숫자 증감 기록 기능 예시를 만들어 보겠습니다.
viewmodel은 액티비티 또는 프래그먼트에 쓰이는 데이터를 준비하고 관리하는 것을 책임지는 역할로 쓰일 수 있는 클래스입니다. viewmodel이 관리하는 데이터는 화면 회전과 같은 구성 변경이 발생해도 유지되며, 액티비티나 프래그먼트가 완전히 종료될 때까지 메모리에 남아있습니다.
UI 관련 코드와 데이터 처리 로직이 분리되 코드 구조 관리에 유리, 액티비티/프래그먼트가 완전히 종료될 때 viewmdoel도 함께 정리 됨에 따른 메모리 누수 방지, 구성 변경 시 데이터 자동 보존으로 별도 코드 작성 부담 감소 등의 장점을 가집니다.
레이아웃 xml 파일 코드(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:id="@+id/counter_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="48sp"
android:layout_marginBottom="32dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/decrement_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-"/>
<Button
android:id="@+id/reset_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="리셋"
android:layout_marginHorizontal="16dp"/>
<Button
android:id="@+id/increment_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+"/>
</LinearLayout>
</LinearLayout>
액티비티 자바 코드
public class MainActivity extends AppCompatActivity {
private CounterViewModel viewModel;
private TextView counterTextView;
private Button incrementButton;
private Button decrementButton;
private Button resetButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// UI 구성요소 참조 가져오기
counterTextView = findViewById(R.id.counter_text);
incrementButton = findViewById(R.id.increment_button);
decrementButton = findViewById(R.id.decrement_button);
resetButton = findViewById(R.id.reset_button);
// ViewModel 인스턴스 획득
viewModel = new ViewModelProvider(this).get(CounterViewModel.class);
// 초기 UI 업데이트
updateCounterDisplay();
// 버튼 클릭 리스너 설정(증가)
incrementButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.incrementCounter();
updateCounterDisplay();
}
});
// 버튼 클릭 리스너 설정(감소)
decrementButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.decrementCounter();
updateCounterDisplay();
}
});
// 버튼 클릭 리스너 설정(리셋)
resetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.resetCounter();
updateCounterDisplay();
}
});
}
// UI 업데이트 메서드
private void updateCounterDisplay() {
counterTextView.setText(String.valueOf(viewModel.getCounter()));
}
}
실행 결과
화면 회전 같은 구성변경 발생시 데이터가 유지되는 것을 확인할 수 있습니다.
'안드로이드 자바' 카테고리의 다른 글
[Java][Android] ScaleAnimation 사용하여 애니메이션 효과 넣기 (0) | 2025.05.13 |
---|---|
[Java][Android] 가속계(accelerometer)센서 감지하기 (0) | 2025.05.12 |
[Java][Android] 날짜 선택 후 요일 계산해서 보여주는 방법 (0) | 2025.05.06 |
[Java][Android] WorkManager로 백그라운드 작업 하기 (2) | 2025.05.05 |
[Java][Android] 데이터바인딩 활용 예시 만들기 (2) | 2025.05.02 |