안드로이드 텍스트뷰 속성 6. [editable, elegantTextHeight, ellipsize, marqueeRepeatLimit] (Android TextView Attributes 6)

2016. 9. 23. 17:43


1. TextView 속성 (6)

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를 편집 가능하게 만들기. (editable)

TextView를 EditText처럼 텍스트 편집이 가능하도록 만드려면 "editable" 속성을 true로 지정하면 됩니다.

  * android:editable - TextView를 편집 가능하도록 만들기.
        > true 또는 false 값 지정 (기본 값 false).
        > deprecated in API Level 3

하지만 editable 속성은 API Level 3에서 deprecated되어 사용할 수 없습니다. 대신, EditText 위젯을 사용해야 합니다.

editable is deprecated


2.2 elegant height metrics 플래그 설정으로 텍스트의 높이 늘리기. (elegantTextHeight)

"elegantTextHeight" 속성을 사용하면 TextView의 elegant height metrics 플래그를 켭니다. 이 플래그를 켬으로써, Latin-based vertical metrics에 맞춰지지 않은 폰트 변형(font variants)을 선택하게 되고, 세로 방향으로 좀 더 많은 공간을 제공하기 위해 top, bottom 경계를 증가시킵니다.


결과적으로, TextView에 표시되는 텍스트의 높이가 늘어나는 효과가 생깁니다.

  * android:elegantTextHeight - elegant height metrics 플래그 켜기.
        > true 또는 false 값 지정 (기본 값 false).
        > 텍스트의 높이가 더 높아짐.
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:background="#FF0000"
        android:text="TEXT1_t_가나다라"
        android:textSize="20sp"
        android:elegantTextHeight="false" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView2"
        android:background="#00FF00"
        android:text="TEXT1_t_가나다라"
        android:textSize="20sp"
        android:elegantTextHeight="true" />

elegantTextHeight 속성


2.3 TextView의 텍스트가 TextView의 너비보다 길 때, 생략기호(...) 사용 또는 텍스트 흐름 효과 사용 하기. (ellipsize, marqueeRepeatLimit)

TextView에 표시되는 텍스트의 길이가 TextView의 너비를 넘어서게 되면, 경계에 걸리는 텍스트는 잘려나간 채로 텍스트의 일부분만 표시됩니다. 이러한 표시 방법이 반드시 잘못되었다고 할 수는 없지만, 어떤 상황에서는 텍스트가 TextView 너비를 넘었다는 사실을 인지하지 못하게 만들 수도 있습니다.

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:maxLines="1"
        android:text="This is the example about ellipsize attributes." />

ellipsize 필요성


이런 상황을 대비하여 안드로이드에서는 현재 텍스트가 TextView의 너비를 넘어섰다는 것을 생략기호(...) 등을 사용하여 표시할 수 있는 몇 가지 방법을 제공하는데, "ellipsize" 속성으로 그 방법을 결정할 수 있습니다.

  * android:ellipsize - TextView의 텍스트가 범위를 넘어서면 생략 기호 사용.
        > none, start, middle, end, marquee 값 사용 가능.
          -. none (0)    : 생략기호(...) 사용하지 않음.
          -. start (1)   : 생략기호(...)를 텍스트의 앞 시작 부분에 표시.
          -. middle (2)  : 생략기호(...)를 텍스트의 중간 부분에 표시.
          -. end (3)     : 생략기호(...)를 텍스트의 끝 부분에 표시.
          -. marquee (4) : 텍스트가 오른쪽에서 왼쪽으로 흘러가도록 만들기.

아래 예제 코드는 ellipsize 속성에 "none", "start", "middle", "end"를 적용한 예제입니다. (참고로, 텍스트의 자동 줄넘김을 방지하기 위해 "maxLines" 속성에 "1"을 지정하였습니다. 다른 방법으로 "singleLine" 속성에 "true"를 사용할 수도 있습니다.)

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:maxLines="1"
        android:ellipsize="none"
        android:text="This is the example about ellipsize attribute." />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:maxLines="1"
        android:ellipsize="start"
        android:text="This is the example about ellipsize attribute." />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:maxLines="1"
        android:ellipsize="middle"
        android:text="This is the example about ellipsize attribute." />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:maxLines="1"
        android:ellipsize="end"
        android:text="This is the example about ellipsize attribute." />

ellipsize 속성 none, start, middle, end


아래 예제 코드는 "ellipsize" 속성에 "marquee" 값을 적용한 예제입니다. 아래 코드를 시험하기에 앞서 한가지 주의할 점은 marquee 값이 적용되어 애니메이션이 실행되려면, 해당 TextView가 focus 상태여야 한다는 것입니다. 이를 위해 "focusableInTouchMode" 속성과 "focusable" 속성을 모두 "true"로 설정하였습니다.
(만약 여러 View 위젯이 배치되어 있다면, marquee를 적용할 TextView에 setSelected(true)함수를 호출하여 focus 상태로 바꿔줘야 합니다.)


또한 "marquee" 값의 적용 결과를 확인하려면, ellipsize 속성의 다른 값과 다르게, maxLines 속성이 아니라 singleLine 속성을 사용해야 합니다. (singleLine="true")

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:singleLine="true"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:ellipsize="marquee"
        android:text="This is the example about ellipsize attribute." />



마지막으로 "marqueeRepeatLimit" 속성을 사용하면 marquee 애니메이션을 반복하는 횟수를 지정할 수 있습니다.

  * android:marqueeRepeatLimit - marquee 애니메이션 반복 횟수 지정.
        > 정수 값 또는 "marquee_forever" 사용. (예. 100 = 100회 반복)
          -. marquee_forever (-1) : marquee 애니메이션을 무한 반복.

아래 예제는 marquee 애니메이션을 무한 반복하도록 만드는 소스입니다.

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:singleLine="true"
        android:focusableInTouchMode="true"
        android:focusable="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:text="This is the example about ellipsize attribute." />

3. 참고.


ANDROID 프로그래밍/TEXTVIEW