https://medium.com/androiddevelopers/locale-changes-and-the-androidviewmodel-antipattern-84eb677660d9을 번역한 글입니다.
ViewModel은 화면회전이나 언어 변경에 의한 액티비티 재생성에서도 다시 생성되지 않고 이전 인스턴스가 그대로 남아 유지 되는 특징이 있습니다. 시스템 언어 변경을 하기전에 아래의 ViewModel코드를 보도록 하곘습니다.
//이렇게 코드를 짜지 마세요 public class MyViewModel extends AndroidViewModel { public final MutableLiveData<String> statusLabel = new MutableLiveData<>(); public SampleViewModel(Application context) { super(context); statusLabel.setValue(context.getString(R.string.labelString)); } }
이 코드의 문제는 문자열이 생성자에서만 결정된다는 것입니다. 시스템 언어변경이 발생해도 ViewModel은 재생성 되지 않죠. 그러면 문자열도 다국어 지원이 되지 않을것입니다.
이를 해결할 다른 방법은 리소스의 ID를 활용하는 것입니다.
//String 대신 리소스 ID를 노출시킵니다. public class MyViewModel extends ViewModel { public final MutableLiveData<Int> statusLabel = new MutableLiveData<>(); public SampleViewModel(Application context) { super(context); statusLabel.setValue(R.string.labelString); } }
리소스 ID를 노출시킨뒤 액티비티가 재생성 되었을 때 View가 리소스 ID를 참조하여 올바른 국가 코드의 리소스를 참조할수 있도록 합니다. DataBinding 같은 라이브러리를 사용한다면 레이아웃에 Data가 바인딩 될때 올바른 리소스가 결정 될 수 있도록 도와줄 것입니다.
0개의 댓글