안드로이드를 만들며 3 — strings.xml의 줄바꿈이 공백으로 바뀐 이유
strings.xml에 두 줄로 적은 안내가 화면에서는 한 문장으로 붙었습니다. 네 문자열과 열한 언어를 수정하고, 실제 줄바꿈이 들어간 자원을 찾는 검사를 추가했습니다.
들어가며
설정 화면에서 안내 문장 두 개가 붙어 보였습니다.
선택 안 해도 계산 가능 나중에 이력에서 변경
XML에 적어 둔 두 줄
strings.xml에는 두 줄로 적혀 있었습니다.
<string name="stock_optional_hint">선택 안 해도 계산 가능
나중에 이력에서 변경</string>
종목 선택은 나중에 해도 된다는 두 안내였습니다. 마침표 없이 짧게 끝나는 문구라 줄이 합쳐지자 어디서 끊어 읽어야 할지 알기 어려웠습니다.
자원 파일의 줄바꿈과 화면의 줄바꿈
안드로이드 자원 컴파일러 aapt는 문자열 자원 안에서 이어지는 공백을 하나로 접습니다. XML의 들여쓰기나 줄바꿈이 그대로 화면에 나오는 것을 막는 처리입니다.
<!-- 적은 것 -->
<string name="a">첫 줄
둘째 줄</string>
<!-- 화면에 나오는 것 -->
첫 줄 둘째 줄
파일에서 엔터를 누른 자리가 화면에서도 줄바꿈이 될 거라고 여길 수 있지만, 여기서는 공백으로 합쳐집니다. 화면의 줄바꿈은 \n으로 적어야 합니다.
<string name="a">첫 줄\n둘째 줄</string>
같은 방식으로 작성한 네 문자열
문자열을 더 찾아보니 같은 방식으로 적은 안내가 넷이었습니다. 그중 둘은 각 문장에 마침표가 있어 줄이 붙어도 읽을 수 있었습니다. 처음 눈에 띈 것은 마침표 없이 끝나는 두 문구였습니다.
열한 언어의 번역 파일에도 같은 줄바꿈이 들어 있었습니다. 파일에서는 모두 두 줄이었지만 컴파일하면 한 줄이 됐습니다. 빌드와 린트에서는 오류가 나지 않았습니다.
실제 줄바꿈을 잡는 검사
번역 완성도 검사인 TranslationCompletenessTest에 문자열 내부의 실제 줄바꿈을 찾는 규칙을 추가했습니다. \n으로 적은 줄바꿈은 허용하고, 파일에서 직접 줄을 나눈 경우를 잡도록 했습니다.
검사를 만든 뒤 일부러 두 줄짜리 문자열을 넣어 봤습니다. 그 문자열에서 실패하는 것을 확인하고 임시 문자열을 지웠습니다.
마치며
문자열 안의 실제 줄바꿈을 \n으로 바꾸고, 같은 형태가 다시 들어오면 검사에서 찾도록 했습니다.
마침표 때문에 그럭저럭 읽히던 나머지 두 문자열도 고쳤습니다. 다음 안내를 작성할 때 그대로 따라 쓸 예를 남기고 싶지는 않았습니다.