안드로이드 텍스트뷰 속성 10. [gravity, width, height, minWidth, maxWidth, minHeight, maxHeight, hyphenationFrequency] (Android TextView Attributes 10
1. TextView 속성 (10)
TextView 속성 리스트 및 요약 설명을 확인하시려면 [안드로이드 텍스트뷰 속성] 페이지를 참고하시기 바랍니다.
TextView 속성에 대한 자세한 설명 및 예제를 확인하시려면, 아래 표에서 속성 이름을 클릭하시기 바랍니다.
2. TextView 속성 활용
2.1 TextView의 텍스트 정렬하기. (gravity)
TextView의 텍스트가 TextView 내에서 정렬되는 위치 기준을 지정하고 싶다면, "gravity" 속성을 사용합니다.
* android:gravity - TextView의 텍스트 정렬 방식 지정.
> x축(좌/우)과 y축(상/하)에 대한 텍스트 정렬.
> 아래 값들 중에서 하나 이상의 값을 '|' 기호로 혼합하여 사용.
-. top (0x30) : 위쪽을 기준으로 정렬. (크기는 변하지 않음.)
-. bottom (0x50) : 아래쪽을 기준으로 정렬. (크기는 변하지 않음.)
-. left (0x03) : 왼쪽을 기준으로 정렬. (크기는 변하지 않음.)
-. right (0x05) : 오른쪽을 기준으로 정렬. (크기는 변하지 않음.)
-. center_vertical (0x10) : 세로 기준으로 가운데 정렬. (크기는 변하지 않음.)
-. fill_vertical (0x70) : 세로 방향으로 가득 채움. (세로 방향으로 크기 늘림.)
-. center_horizontal (0x01) : 가로 기준으로 가운데 정렬. (크기는 변하지 않음.)
-. fill_horizontal (0x07) : 가로 방향으로 가득 채움. (가로 방향으로 크기 늘림.)
-. center (0x11) : 가로, 세로 기준으로 가운데 정렬. (크기는 변하지 않음.)
-. fill (0x77) : 가로, 세로 방향으로 가득 채움. (가로, 세로 방향으로 크기 늘림.)
-. clip_vertical (0x80) : 세로 기준으로 View를 넘어서는 텍스트 자르기.
-. clip_horizontal (0x08) : 가로 기준으로 View를 넘어서는 텍스트 자르기.
-. start (0x00800003) : 시작 위치에 정렬. (크기는 변하지 않음.)
-. end (0x00800005) : 끝 위치에 정렬. (크기는 변하지 않음.)
> 기본 값은 "top|left"
"gravity" 속성에 적용할 수 있는, 각각의 값의 출력 결과를 살펴보겠습니다.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FF0000"
android:textColor="#FFFFFF"
android:gravity="top"
android:text="top" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#00FF00"
android:gravity="bottom"
android:text="bottom" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#0000FF"
android:textColor="#FFFFFF"
android:gravity="left"
android:text="left" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FFFF00"
android:gravity="right"
android:text="right" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#00FFFF"
android:gravity="center_vertical"
android:text="center_vertical" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FF00FF"
android:gravity="fill_vertical"
android:text="fill_vertical" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FF0000"
android:textColor="#FFFFFF"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#00FF00"
android:gravity="fill_horizontal"
android:text="fill_horizontal" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#0000FF"
android:textColor="#FFFFFF"
android:gravity="center"
android:text="center" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FFFF00"
android:gravity="fill"
android:text="fill" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#00FFFF"
android:gravity="clip_vertical"
android:text="clip_vertical" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FF00FF"
android:gravity="clip_horizontal"
android:text="clip_horizontal" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#FF0000"
android:textColor="#FFFFFF"
android:gravity="start"
android:text="start" />
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="#00FF00"
android:gravity="end"
android:text="end" />
</LinearLayout>
gravity 속성을 사용하지 않았을 때, 기본적인 텍스트의 정렬 위치는 "left|top" 입니다. 그리고 가로 방향(vertical)의 값(left, right, xxx_horizontal)만 지정하면 세로 방향(vertical)은 "top"이 지정됩니다. 마찬가지로 세로 방향(horizontal)의 값(top, bottom, xxx_vertical)만 지정하면 가로 방향(horizontal)의 값은 "left"가 적용됩니다.
"center" 값은 "center_horizontal|center_vertical"과 동일 결과를 출력합니다.
TextView의 gravity 값 중, "fill_vertical", "fill_horizontal", "fill", "clip_vertical", "clip_horizontal" 값은 텍스트 출력 시, 그 효과가 적용되지 않는 것으로 판단됩니다.
"start", "end"는 RTL(Right To Left) 언어 설정을 사용하는 기기에서 좌,우 대칭이 변경되더라도 대응될 수 있도록 사용되는 값입니다. Android 4.2 (API Level 17) 부터 제공되며, "left", "right" 값 대신 사용해야 하는 값입니다.
"start", "end"와 "left", "right"의 차이점을 좀 더 상세하게 확인하시려면, [drawableLeft와 drawableStart, drawableRight와 drawableEnd의 차이]의 내용을 참고하시기 바랍니다.
2.2 TextView의 크기 지정 및 최대 크기 설정. (height, minHeight, maxHeight, width, minWidth, maxWidth)
TextView에 고정된 크기를 지정하기 위해 "width"와 "height" 속성을 사용할 수 있습니다.
* android:width - TextView의 고정된 너비 지정.
> 치수 단위 값 사용. (sp, px, dp, in, mm 단위 사용 가능)
* android:height - TextView의 고정된 높이 지정.
> 치수 단위 값 사용. (sp, px, dp, in, mm 단위 사용 가능)
지금까지 여러 예제를 만들어오면서 TextView가 화면에 표시되는 영역의 크기를 지정하기 위해 "layout_width"와 "layout_height"를 사용했습니다. 그런데 여기서 "width", "height" 라는, TextView의 크기를 지정하는데 사용되는 속성이 또 있다고 설명하네요. 그럼 두 종류의 속성들이 같은 역할을 수행하는 걸까요? 대답은, "NO" 입니다.
TextView의 크기를 설정하는 기능과 그 출력 결과가 비슷하다고 해도, 두 종류의 속성은 분명 역할이 다릅니다. "layout_width", "layout_height" 속성은 TextView가 최종적으로 화면에서 차지하고자 하는 영역의 크기를 지정하는 속성입니다. 반면 "width", "height" 속성은 TextView가 가지는 본래(내용)의 크기를 고정시킬 때 사용하는 속성이죠. 즉, 실질적으로 출력되는 텍스트의 높이 또는 길이와 상관없이 TextView가 고정된 크기를 가지도록 만드는 것이죠.
"width"와 "height"의 출력 결과는 아래의 예제를 보면 확인할 수 있습니다.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="#FF0000"
android:textColor="#FFFFFF"
android:text="TEXT1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00FF00"
android:height="30dp"
android:width="100dp"
android:text="TEXT2" />
</LinearLayout>
예제에서 추가된 두 개의 TextView 모두 "layout_width", "layout_height"를 "wrap_content"로 설정하여, TextView의 출력 내용에 따라 영역 크기를 가지도록 작성되었습니다. 그런데 첫 번째 TextView는 "TEXT1" 텍스트에 딱 맞는 영역 크기를 가지지만, 두 번째 TextView는 "TEXT2"라는 텍스트 크기와 관계없이, "width", "height" 속성에 지정한 "100dp", "30dp" 만큼의 크기로 출력되죠.
또한 당연하게도, "layout_width", "layout_height" 속성에 "wrap_content" 이외의 값을 지정하면, "width", "height" 속성에 지정한 값은 무시됩니다. 즉, "layout_width"와 "layout_height"에 지정된 값이 최종적으로 적용되는 것입니다.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:background="#FF0000"
android:textColor="#FFFFFF"
android:height="30dp"
android:width="100dp"
android:text="TEXT1" />
<TextView
android:layout_width="200dp"
android:layout_height="60dp"
android:layout_marginBottom="20dp"
android:background="#00FF00"
android:height="30dp"
android:width="100dp"
android:text="TEXT2" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#0000FF"
android:textColor="#FFFFFF"
android:height="30dp"
android:width="100dp"
android:text="TEXT3" />
</LinearLayout>
"layout_width"와 "layout_height"에 상수 값(예. 20dp)을 지정하면 지정한 크기대로 View의 영역이 결정됩니다. 그런데 "wrap_content" 값을 지정하면, View가 실제 화면에 나타날 때의 크기가 계산되어 View의 영역으로 사용되죠. 이 때 "width" 또는 "height" 속성을 사용하면 View의 영역이 계산되지 않고 "width"와 "height"에 지정된 값이 사용되는 것입니다.
TextView가 가질 수 있는 최소 높이 및 최대 높이를 지정하려면, 각각 "minHeight", "maxHeight" 속성을 사용합니다. 그리고 최소 너비 및 최대 너비는 "minWidth", "maxWidth" 속성을 사용해 설정할 수 있습니다.
* android:minHeight - TextView의 최소 높이 지정.
> 치수 단위 값 사용. (sp, px, dp, in, mm 단위 사용 가능)
* android:maxHeight - TextView의 최대 높이 지정.
> 치수 단위 값 사용. (sp, px, dp, in, mm 단위 사용 가능)
* android:minWidth - TextView의 최소 너비 지정.
> 치수 단위 값 사용. (sp, px, dp, in, mm 단위 사용 가능)
* android:maxWidth - TextView의 최대 너비 지정.
> 치수 단위 값 사용. (sp, px, dp, in, mm 단위 사용 가능)
TextView 대신 EditText(TextView의 자식 클래스)를 사용하여 minWidth 및 maxHeight 속성을 사용한 예제입니다. 이 때 width 속성(TextView에 고정 너비 사용)은 사용하지 않은 것을 주의하세요. width 속성이 사용되면 minWidth와 maxWidth에 지정한 값은 무시됩니다.
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="70dp"
android:maxWidth="200dp"
android:background="#00FF00"
android:text="" />
2.3 TextView에 "자동 '-'(hyphen) 넣기" 빈도 조절하기. (hyphenationFrequency)
TextView에 입력된 텍스트가 View의 크기를 넘어서게 되어 줄 바꿈이 일어나게 되면, 줄 바꿈이 일어나는 곳에서 자동적으로 '-'(hyphen)이 삽입되게 만들 수 있습니다. 이를 위해 "hyphenationFrequency" 속성을 사용하며, '-'(hyphen)이 삽입되는 빈도(frequency) 또한 조절할 수 있습니다.
* android:hyphenationFrequency - '-'(hyphen)이 추가되는 빈도 설정
> none, normal, full 중 한 가지 사용.
-. none (0) : '-'(hyphen) 추가 기능 사용 안함.
-. normal (1) : '-'(hyphen) 추가 빈도 낮춤. (채팅과 같은 일반적인 경우 사용)
-. full (2) : 표준 '-'(hyphen) 추가 빈도. (한정된 너비가 적용된 TextView)
hyphenationFrequency의 효과를 확인하기 위해서 아래의 예제 코드를 입력한 다음 몇 줄이 넘어가는 긴 문장을 입력해보시기 바랍니다. 예제에서는 "full" 값을 지정하여, '_'(hyphen)이 삽입되는 빈도(frequency)를 최대로 설정하였습니다. (breakStrategy를 "high_quality" 값으로 지정한 내용도 확인하세요.)
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="80sp"
android:breakStrategy="high_quality"
android:hyphenationFrequency="full"
android:text="" />
그런데 최종적으로 확인한 바로는 시스템 언어 설정이 English 이외의 언어로 설정되어 있는 경우에는 '-'(hyphen)의 자동 추가가 전혀 실행되지 않았습니다. 그러므로 정확한 결과를 확인하시려면 시스템 언어 설정을 "English (United States)"로 변경하신 다음, 실행해보시기 바랍니다.
3. 참고.
- 안드로이드 텍스트뷰 속성 개요
- [안드로이드 텍스트뷰 속성] 내용을 참고하세요.
- TextView 속성에 대한 자세한 도움말.
- [안드로이드 개발 참조문서 TextView 항목] 내용을 참고하세요.
- R.attr에 대한 도움말.
- [안드로이드 개발 참조문서. R.attr 항목]의 내용을 참고하세요.
.END.