일반적으로 같은 화면 에서 데이터 및 UI를 변경하고 사진과 같이 효과를 주면 UI 값의 초기화가 되어 있는것을 확인 할수 있다.
해당 내용의 UI를 지속적으로 반영할수 있게 진행 할려 한다.
먼저 DataBinding 으로 코드를 간략하게 하고 LiveData 와 ViewModel를 이용해 데이터를 유지 할려한다.
1. Gradle 셋팅 (DataBinding)
android {
dataBinding {
enabled = true
}
}
2. layout 셋팅 (DataBinding)
일반 레이아웃과 다르게 DataBinding 을 사용하기 위해 layout 태그를 을 취상위로 감싸고 그 밑에 data 태그를 추가한다.
<?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"
>
<data>
<variable
name="main"
type="com.example.livedataproject.MainActivity"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/countTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textSize="200dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/textAddData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="숫자 카운트"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"/>
</RelativeLayout>
</layout>
3. java 셋팅 (DataBinding)
- 적용전
public class MainActivity extends AppCompatActivity {
Button textAddData;
TextView countTextView;
private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textAddData = findViewById(R.id.textAddData);
countTextView = findViewById(R.id.countTextView);
textAddData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
count++;
countTextView.setText(count+"");
}
});
}
}
- 적용후
public class MainActivity extends AppCompatActivity {
private int count = 0;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.textAddData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
count++;
binding.countTextView.setText(count+"");
}
});
}
}
findviewById 자체를 사용하지 않아 코드 자체가 줄어든것을 확인 할수 있다.
1. Gradle 설정
dependencies {
def lifecycle_version = "2.2.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
}
2. ViewModel 클래스 생성
public class CounterVM extends ViewModel
{
public int count = 0;
}
3. java 셋팅 (ViewModel)
- ViewModelProvides.of 문법은 삭제되어 더이상 사용하지 않는다.
- https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ko
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final CounterVM counterVM = new ViewModelProvider(this).get(CounterVM.class);
binding.countTextView.setText(counterVM.count+"");
binding.textAddData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
counterVM.count++;
binding.countTextView.setText(counterVM.count+"");
}
});
}
이제 LiveData를 이용해 만들어보자.
LiveData에는 값이 변경될때마다 값을 변경할수 있는 (관찰?) 옵져버블이 지원 되므로 사용이 가능하다.
1. ViewModel 클래스 수정
public class CounterVM extends ViewModel
{
public MutableLiveData<Integer> count = new MutableLiveData<>();
public CounterVM() {
count.setValue(0);
}
public void setPlusCount()
{
count.setValue(count.getValue() +1);
}
}
2. java 셋팅 (LiveData)
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
final CounterVM counterVM = new ViewModelProvider(this).get(CounterVM.class);
binding.countTextView.setText(counterVM.count+"");
binding.textAddData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
counterVM.setPlusCount();
}
});
counterVM.count.observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
binding.countTextView.setText(integer+"");
}
});
}
※ 더 좋은 내용있으면 댓글 주세요!
'ANDROID' 카테고리의 다른 글
Android UI - Animation (Transition) (0) | 2020.09.27 |
---|---|
Android UI - Animation (Button) (0) | 2020.09.27 |
Android UI - Animation (Loading) (0) | 2020.09.19 |
간단하게 RecyclerView 를 달아보자 (0) | 2020.07.31 |
Retrofit2 + Okhtttp3 를 이용하여 데이터를 달아보자 (0) | 2020.03.01 |