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가 바인딩 될때 올바른 리소스가 결정 될 수 있도록 도와줄 것입니다.

Buy me a coffeeBuy me a coffee
카테고리: AndroidJava

0개의 댓글

답글 남기기

이메일은 공개되지 않습니다.