Do it! 안드로이드 앱 프로그래밍
텍스트뷰(TextView)와 입력상자(EditText)의 다른 기능들
앞선 블로깅들에서 소개한 속성들 외에 각각의 위젯이나 뷰가 가지는 속성은 매우 다양하다. 보통 대부분의 위젯들은 TextView(텍스트뷰)
와 EditText(입력상자)
의 속성을 그대로 사용하는 경우가 많으므로 이번 글에서는 TextView
와 EditText
위젯에서 사용되는 좀 더 다양한 속성들을 소개하려고 한다.
예제 코드는 Github에서 확인할 수 있다.
커서
커서는 이름 그대로 혹은 다른 언어에서 사용되듯이 현재 데이터를 처리하고 있는 위치를 가리키는 말이다. 특히 문자열을 다루는 TextView
와 EditView
에서는 중요한 기능이다. EditView
의 입력상자에서 커서가 깜빡이는 곳이 현재 위치를 의미하고, 일반적인 애플리케이션에서 입력상자를 클릭할 경우 문자열의 제일 끝에서 시작하고, 다시 클릭할 경우 클릭이 된 곳으로 커서가 이동되는 것을 볼 수 있다.
이러한 커서의 특징및 EditView
에 Focus(집중, 선택)
되는지 안되는지에 따라서 여러가지 작업을 할 수 있다.
selectOnAllFocus
속성의 경우 이름 그대로 EditView
의 입력상자를 선택할 경우 모든 문자열을 선택하도록 하는 대표적인 속성이다. 깜빡이는 커서를 보이지 않게 하는 속성은 cursorVisible
속성이고 이외에 다양한 속성이 존재 한다.
아래의 표에서 소개하는 메소드 및 다양한 메소드들을 통해서 여러가지 문자열 수정작업을 수행할 수 있다.
속성 조절 메소드(Method) |
기능 |
public int getSelectionStart() |
선택된 문자열의 시작지점을 반환한다 |
public int getSelectionEnd() |
선택된 문자열의 끝 지점을 반환한다 |
public void setSelection(int start, int stop) |
선택을 원하는 문자열을 지정한다 |
public void setSelection() |
원하는 커서의 위치를 지정한다 |
public void selectAll() |
모든 문자열을 선택한다 |
public void extendSelection() |
현재 선택된 지점외에 추가로 더 지정한다 |
자동으로 링크 만들기
앱을 사용하거나 웹페이지를 둘러볼 때, 전화번호, 이메일주소, 웹페이지주소 등에 자동적으로 링크가 생성되어 있는 것을 볼 수 있다. 안드로이드에서도 해당 기능을 제공하고 있다. 간단히 autoLink
속성을 통해 변경할 수 있다.
java
코드에서는 View.setAutoLink()
메소드를 통해 설정할 수 있으며, 자동으로 링크를 만들기 원하는 데이터를 지정할 수 있다. 아래 표의 값들을 인자 값으로 전달할 수 있으며 | (or)
연산을 통해 여러 설정을 지정할 수 있다.
setAutoLink() 인자 값 |
옵션이 하는일 |
0x1 |
웹 페이지의 url 형태의 문자열을 자동으로 전환 |
0x2 |
이메일 주소 형태의 문자열을 자동으로 전환 |
0x4 |
전화번호 형태의 문자열을 자동으로 전환 |
0x8 |
주소 형태의 문자열을 자동으로 전환 |
줄 간격 조정하기
워드나 한글등에서 기본적으로 제공하는 옵션과 동일하게 글자의 줄 간격을 조절 할 수 있다. lineSpacingMultiplier
속성은 이름 그대로 기본 줄 간격의 배수 단위로 줄간격을 설정하도록 도와주는 속성이고, lineSpacingExtra
는 원하는 단위로 줄 간격을 추가할 수 있는 속성이다. 보통 lineSpacingExtra
를 사용하여 줄 간격을 조절한다고 한다.
java
코드에서는 setLineSpacing(extra, multiplier)
메소드를 통해 줄 간격을 조절할 수 있다.
자동 대소문자, 문자열 줄임, 입력 문자 힌트 설정
앱을 사용하여 문자를 입력할 경우 문장의 첫 문자 혹은 단어의 첫 문자가 자동으로 대문자화 되는 것을 볼 수 있을 것이다. 이런 것처럼 안드로이드는 자동으로 대소문자화를 해주는 속성을 제공한다.
capitalize
속성이 자동 대문자화를 지원해주는 속성으로써 character
로 설정할 경우 모든 문자를 대문자로, words
로 설정할 경우 각 단어의 첫 글자를 대문자로, sentences
를 지정하면 각 문장의 첫 글자를 대문자로 자동 치환한다.
java
코드에서는 et1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);
와 같은 사용법을 통해 설정할 수 있다.
TextView
나 EditText
의 크기가 한정적이고 입력된 문자열의 길이가 너무 긴 경우에는 문자열을 한 줄로 표시하도록 하고, 화면을 넘어가는 문자열을 말줄임표를 통해 ‘…’으로 표시하도록 할 수 있다.
ellipsize
속성이 어느 위치에 말 줄임표를 표시할 것인지 정하는 속성이고, singleLine
속성이 문자열을 한줄로 표시하도록 하는 속성이다.
ellipsize
속성에는 start
, middle
, end
값을 설정할 수 있으며 각각 시작지점, 중간지점, 끝 지점에 말줄임표를 표시한다.
EditText
를 사용하는 경우 사용자에게 어떤 문자열을 입력할 지 힌트를 줄 수 있다. 예를 들어 현재 입력칸에는 주소를, 다음 입력칸에는 비밀번호를 입력하라고 알려줄 수 있는데, 이런 기능을 수행하는 것이 hint
속성이다.
문자열의 변경 이벤트 처리하기
EditText
에 문자열을 추가/삭제 할 경우 모든 상황이 이벤트로 처리되는데, 이러한 이벤트 상황에서 자신이 원하는 문자열 처리를 진행할 수 있다. 현재 EditText
에 입력된 문자열을 확인하는 메소드는 getText()
메소드 이며 toString()
메소드를 통해 String
타입의 문자열을 확인할 수 있다.
만약 문자열이 사용자의 입력에 따라 변화하는 상황에서 변하는 상황을 확인하고 싶다면 TextWatcher
를 등록하여 확인할 수 있다.
public void addTextChangedListener(TextkWaktcher watcher);
public void beforeTextChanged (CharSequence s, int start, int count, int after);
public void onTextChanged (CharSequence s, int start, int before, int count);
public void afterTextChanged (Editable s);
위의 클래스 및 메소드가 주요 함수들이다. 이름에서 볼 수 있듯이 사용자가 입력하는 순간 변하기 전의 상황에 beforeTextChanged
메소드가 호출되고, 변환시키는 순간 onTextChanged
메소드가 호출 된다. afterTextChanged
메소드는 변화가 끝난뒤에 호출한다.
3가지 함수중 afterTextChanged
메소드만이 Editable
객체를 지원하는데, 이는 사용자의 입력이 끝난 후에만 문자열에 변화를 줄 수 있음을 의미한다.
afterTextChanged
함수에서 EditText
의 문자열을 변경할 경우 다시 TextChangedListener
이벤트가 발생하여 afterTextChanged
함수를 중복적으로 호출하게 되므로, 무한 루프에 빠지지 않도록 잘 처리해야 한다.
특정 EditText
의 경우 문자열의 n bytes
를 넘지않도록 하는 경우를 볼 수 있다. 문자메시지 앱이나 아이디 입력칸이 대표적인데, 이러한 작업들도 TextChangedListener
를 통해 수행할 수 있다.
입력되는 문자열에 제한을 주는 더 쉬운 방법은 InputFilter
를 사용하는 것이다. EditText
뷰에 setFilters()
메소드를 이요하여 문자열 입력시 걸러내고 싶은 필터 정보를 추가하면 자동적으로 문자열을 걸러 내게 된다. 아래의 java
코드는 문자열 길이제한을 주는 예제 코드이다.
EditText et1 = (EditText) findViewById(R.id.edittext1);
et1.setFilters(new InputFilter[] {new InputFilter.LengthFilter(15)});
마무리
오늘의 글에서는 EditText
와 TextView
의 다양한 속성들을 알아보았다. 이러한 속성들을 잘 이용할 경우 문자열 처리를 효율적으로 할 수 있으며, SMS
와 같은 앱을 효율적으로 구현할 수 있게 된다.
해당 속성들을 이용한 예제는 Github에서 확인할 수 있다.