안드로이드 텍스트뷰 속성 9. [freezesText] (Android TextView Attributes 9)

2016. 10. 10. 19:41


1. TextView 속성 (9)

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의 현재 상태 유지시키기 . (freezesText)

보통 안드로이드 기기의 방향에 따라, 화면 방향 모드가 "가로모드에서 세로모드로" 또는 "세로모드에서 가로모드로" 전환되면, Java 코드에서 setText() 함수로 설정된 TextView 텍스트는 사라집니다. (정확히는, 실행 중인 Activity가 재 시작됨으로 인해 TextView의 내용이 초기상태로 되돌아 갑니다.)


이 때 TextView의 "freezesText" 속성을 사용하면, TextView가 현재(최종) 상태를 그대로 유지할 수 있게 됩니다. TextView에 유지되는 상태 정보에는 텍스트 뿐만 아니라 커서 위치와 같은 메타 데이터까지 포함됩니다.

  * android:freezesText - TextView의 상태 유지.
        > true 또는 false 값 지정 (기본 값 false).
        > 유지되는 정보에는 텍스트, 커서 위치 등이 포함.
        > EditText에서는 설정 값과 관계없이 true로 적용.

원래 EditText에서도 TextView와 마찬가지로 freezesText 속성의 설정에 따라 상태 유지 기능이 동작하였으나, (버전에 대한 공식 기록은 확인하지 못했지만) 최근 업데이트 된 SDK에서 무조건 true로 동작되도록 바뀌었습니다.

만약 freezesText 속성이 EditText에서 동작하는 SDK 버전을 사용하고 있다면, freezesText 속성을 사용할 때 한 가지 주의할 점이 있습니다. 바로, "id" 속성에 EditText의 ID를 반드시 지정해야 EditText 현재 상태 유지 기능이 정상적으로 동작한다는 것입니다. id 속성에 EditText의 ID 값을 지정하지 않으면 freezesText에 의한 상태 유지 기능이 동작하지 않습니다. (안드로이드 시스템 내부적으로 EditText의 id를, 저장 데이터 식별을 위한 key 값으로 사용하는 것이 아닌가 판단됩니다.)

freezesText 속성의 동작을 확인하기 위한 예제는 아래와 같습니다.


먼저, freezesText 속성이 적용된 TextView와 적용되지 않은 TextView를 화면에 배치합니다. 그리고 앱 실행 중, TextView 들의 텍스트를 변경하기 위해 Button을 배치합니다.

[STEP-1] "activity_main.xml" - freezesText 속성을 위한 TextView 및 Button 배치.
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FF0000"
        android:textColor="#FFFFFF"
        android:textSize="30sp"
        android:id="@+id/textView1"
        android:freezesText="false"
        android:text="" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#00FF00"
        android:textSize="30sp"
        android:id="@+id/textView2"
        android:freezesText="true"
        android:text="" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button1"
        android:text="change text"/>

그리고 Button의 클릭 이벤트 핸들러에서, TextView의 텍스트를 변경하는 코드를 작성합니다.

[STEP-2] "MainActivity.java" - Button의 클릭 이벤트 핸들러에서 TextView의 텍스트 변경.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ... 코드 계속

        Button button1 = (Button) findViewById(R.id.button1) ;
        button1.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView textView1 = (TextView) findViewById(R.id.textView1) ;
                textView1.setText("freezesText is false") ;

                TextView textView2 = (TextView) findViewById(R.id.textView2) ;
                textView2.setText("freezesText is true") ;
            }
        });
    }
}

이제, 앱을 빌드하고 실행하면 빈 TextView가 화면에 표시되고, "CHANGE TEXT" 버튼을 선택하면 TextView의 텍스트가 다음과 같이 변경됩니다.

텍스트뷰 freezesText 속성 예제

그런 다음 기기(Device)의 화면을 가로모드에서 세로모드로 변경하면, freezesText 속성이 "false"로 지정된 TextView의 텍스트는 사라지고, "true"로 지정된 TextView의 텍스트는 남아 있는 것을 확인할 수 있습니다.

freezesText 속성 적용 화면


3. 참고.


ANDROID 프로그래밍/TEXTVIEW