안드로이드 텍스트뷰 속성 10. [gravity, width, height, minWidth, maxWidth, minHeight, maxHeight, hyphenationFrequency] (Android TextView Attributes 10

2016. 10. 14. 19:52


1. TextView 속성 (10)

TextView 속성 리스트 및 요약 설명을 확인하시려면 [안드로이드 텍스트뷰 속성] 페이지를 참고하시기 바랍니다.


TextView 속성에 대한 자세한 설명 및 예제를 확인하시려면, 아래 표에서 속성 이름을 클릭하시기 바랍니다.


속성 속성 속성 속성 속성
autoLink autoText breakStrategy bufferType capitalize
cursorVisible digits drawableBottom drawableEnd drawableLeft
drawablePadding drawableRight drawableStart drawableTint drawableTintMode
drawableTop editable editorExtras elegantTextHeight ellipsize
ems fontFamily fontFeatureSettings freezesText gravity
height hint hyphenationFrequency imeActionId imeActionLabel
imeOptions includeFontPadding inputMethod inputType letterSpacing
lineSpacingExtra lineSpacingMultiplier lines linksClickable marqueeRepeatLimit
maxEms maxHeight maxLength maxLines maxWidth
minEms minHeight minLines minWidth numeric
password phoneNumber privateImeOptions scrollHorizontally selectAllOnFocus
shadowColor shadowDx shadowDy shadowRadius singleLine
text textAllCaps textAppearance textColor textColorHighlight
textColorHint textColorLink textIsSelectable textScaleX textSize
textStyle typeface width

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>

TextView gravity 속성 예제


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 width, height 속성 예제


예제에서 추가된 두 개의 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"에 지정된 값이 사용되는 것입니다.

width, height 속성과 layout_width, layout_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="" />

TextView minWidth, maxWidth 속성 예제


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)"로 변경하신 다음, 실행해보시기 바랍니다.

TextView hyphenationFrequency 속성 예제


3. 참고.

.END.


ANDROID 프로그래밍/TEXTVIEW