이번 시간에는 화면 전환 시 데이터가 초기화되는 현상을 막는 방법에 대하여 알아보겠습니다. 이전 포스팅에 이어서
진행하니 미리 보고 오시면 되겠습니다.
2022.05.10 - [안드로이드] - [안드로이드] DataBinding 컴포넌트 쉽게 접근하는 방법
build.gradle(Module:프로젝트명:app)
dependencies 괄호 안에 아래 코드를 넣어주시면 됩니다.
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.4.1'
- 설명 -
1. MainActivity에서 관리하던 score 변수를 옮겼습니다.
2. scorePlus() score변수값을 증가시킵니다.
3. scoreMinus() score변수값을 감소시킵니다.
public class MainViewModel extends ViewModel {
int score = 0;
public MainViewModel() {
Log.d("MainViewModel", "MainViewModel 생성");
}
@Override
protected void onCleared() {
super.onCleared();
Log.d("MainViewModel", "MainViewModel 종료");
}
public void scorePlus(){
score++;
}
public void scoreMinus(){
score--;
}
}
- 설명 -
화면 회전 시 화면이 망가져서 레이아웃을 변경했습니다.
<?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">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/plus_btn"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_alignParentTop="true"
android:text="더하기"
android:textSize="25sp"/>
<TextView
android:id="@+id/score_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="100sp" />
<Button
android:id="@+id/minus_btn"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_alignParentBottom="true"
android:text="빼기"
android:textSize="25sp"/>
</RelativeLayout>
</layout>
- 설명 -
1. MainActivity에서 있던 score 변수가 MainViewModel클래스로 옮겨가면서 화면 회전 시 액티비티 초기화로 인해 변수까지 초기화되는 현상이 사라졌습니다.
2. score값을 증가시키고 감소시키는 기능도 MainViewModel클래스로 옮겨서 코드가 훨씬 깔끔해졌습니다.
public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding;
MainViewModel mainViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//초기화
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
Log.d("MainActivity", "OnCreate");
//ViewModel에서 score값 가져옴
binding.scoreText.setText(String.valueOf(mainViewModel.score));
//마이너스 버튼
binding.minusBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainViewModel.scoreMinus();
binding.scoreText.setText(String.valueOf(mainViewModel.score));
}
});
//플러스 버튼
binding.plusBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainViewModel.scorePlus();
binding.scoreText.setText(String.valueOf(mainViewModel.score));
}
});
}//onCreate
}//MainActivity
2022.04.29 - [안드로이드] - [안드로이드] LineChart 만드는 방법 part1 - 기본 구현
2022.04.08 - [안드로이드] - [안드로이드] Tab Custom Animation part1 - 화면 구성
2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB
[안드로이드] LiveData 만드는 방법 part2 - 레이아웃에 ViewModel 직접 적용 (0) | 2022.05.13 |
---|---|
[안드로이드] LiveData 만드는 방법 part1 - 실시간 데이터 변경 (0) | 2022.05.12 |
[안드로이드] DataBinding 컴포넌트 쉽게 접근하는 방법 (0) | 2022.05.10 |
[안드로이드] HTTP 통신 Volley 사용법 part3 - Image 요청 및 응답 (0) | 2022.05.09 |
[안드로이드] HTTP 통신 Volley 사용법 part2 - JSON 요청 및 파싱 (0) | 2022.05.08 |
댓글 영역