안드로이드 에디트텍스트 속성 4. [imeActionId, imeActionLabel, imeOptions, privateImeOptions] (Android EditText Attributes 4)

2016. 10. 24. 15:54


1. EditText 속성 (4)

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


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


속성 속성 속성 속성 속성
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. EditText 속성 활용

2.1 텍스트 입력기(IME) 설정 및 액션 버튼 기능 바꾸기. (imeActionId, imeActionLabel, imeOptions, privateImeOptions)

EditText를 선택하면, 선택된 EditText의 커서 위치에 텍스트를 입력할 수 있는 텍스트 입력기(IME, Input Method Editor)가 나타납니다. 텍스트 입력기(IME)는 여러 가지 종류의 문자 입력을 위한 키보드 역할을 수행하므로 소프트 키보드(Soft-Keyboard)라고 지칭하기도 합니다.


텍스트 입력기(IME)는 표시 영역, 형태, 기능 등의 대부분이 미리 정의되어 있지만, 몇 가지 요소들에 대해서는 텍스트 입력기(IME)를 실행시키는 개발자가 커스터마이징할 수 있는 방법을 제공합니다. (하지만 만약, 현재 사용 중인 텍스트 입력기(IME)를 만든 개발자가 텍스트 입력기의 확장성을 제거하였다면 아래의 내용이 정상적으로 실행되지 않을 수 있습니다.)


먼저, 텍스트 입력기(IME)는 액션(Action) 버튼이라는 특수 목적의 버튼을 제공하는데, 텍스트 입력기(IME)가 표시되는 상황 또는 목적에 따라 액션 버튼의 표시 내용과 수행 기능을 바꿀 수 있습니다.

텍스트 입력기(IME)의 액션 버튼 위치


이러한 텍스트 입력기(IME) 액션 버튼이 눌려졌을 때의 기능을 수정하려면 "imeActionId" 속성을 사용하고, 액션 버튼에 표시되는 라벨을 바꾸기 위해서는 "imeActionLabel" 속성을 사용합니다.


그런데 imeActionId 또는 imeActionLabel 속성에 대해 알아보기에 앞서, 텍스트 입력기(IME)가 화면에 출력될 때, 화면 영역을 차지하는 범위를 설정하거나 액션 버튼이 미리 정해진 모양 또는 Id를 가지도록 만들 수도 있습니다. 이 때 "imeOptions"라는 속성을 사용합니다.

2.1.1 imeOptions 속성

텍스트 입력기(IME)의 액션 버튼의 동작 및 옵션을 설정하기 위해 "imeOptions" 속성을 사용합니다.

  * android:imeOptions - 텍스트 입력기(IME)의 표시 옵션 지정.
        > 아래의 값들 중 하나 이상을 '|'로 조합하여 사용 가능.
          -. normal (0x00000000)                : 특별한 기능 사용하지 않음.
          -. actionUnspecified (0x00000000)     : 특별한 액션 없음. (IME_NULL)
          -. actionNone (0x00000001)            : 액션을 사용하지 않음. (IME_ACTION_NONE)
          -. actionGo (0x00000002)              : 액션 버튼이 "go" 역할 수행. (예. URL 입력 후 이동.) 
                                                    (IME_ACTION_GO)
          -. actionSearch (0x00000003)          : 액션 버튼이 "search" 기능 수행. (예. 단어 검색) 
                                                    (IME_ACTION_SEARCH)
          -. actionSend (0x00000004)            : 액션 버튼이 "send" 기능 수행. (예. 문자 발송)
                                                    (IME_ACTION_SEND)
          -. actionNext (0x00000005)            : 액션 버튼이 "next" 역할 수행. (예. 다음 단계 이동)
                                                    (IME_ACTION_NEXT)
          -. actionDone (0x00000006)            : 액션 버튼이 "done" 역할 수행. (예. 입력 완료)
                                                    (IME_ACTION_DONE)
          -. actionPrevious (0x00000007)        : 액션 버튼이 "previous" 역할 수행. (예. 이전 단계 이동)
                                                    (IME_ACTION_PREVIOUS)
          -. flagNoFullscreen (0x2000000)       : 전체 화면 표시 못하도록 요청. (IME_FLAG_NO_FULLSCREEN)
          -. flagNavigatePrevious (0x4000000)   : actionPrevious와 같음. multiline에서도 동작. 
                                                    (IME_FLAG_NAVIGATE_PREVIOUS)
          -. flagNavigateNext (0x8000000)       : actionNext와 같음. multiline에서도 동작.
                                                    (IME_FLAG_NAVIGATE_NEXT)
          -. flagNoExtractUi (0x10000000)       : 텍스트 편집기(IME)가 전체화면과 같은 extracted UI 형태로
출력되지 않도록 만들 때 사용. (IME_FLAG_NO_EXTRACT_UI) -. flagNoAccessoryAction (0x20000000) : 커스텀 액션 버튼 감추기. (IME_FLAG_NO_ACCESSORY_ACTION) -. flagNoEnterAction (0x40000000) : 텍스트 입력기(IME)의 엔터 버튼이 액션 버튼으로 동작되지 않도록 만듬. (IME_FLAG_NO_ENTER_ACTION) -. flagForceAscii (0x80000000) : ASCII 문자가 입력 가능하도록 요청. (IME_FLAG_FORCE_ASCII)

imeOptions 속성을 사용할 때 한 가지 알아둬야 할 내용이 있습니다. 그것은 바로 imeOptions에 지정한 속성 값이 액션 버튼에 반영이 되지 않는 경우가 있다는 것입니다.


액션 버튼이 사용되는 중요한 용도 중에 멀티 라인 입력 필드에서의 줄 바꿈(Carriage Return & Line Feed) 기능이 있습니다. 멀티 라인 입력 필드에서는 기본적으로 액션 버튼이 줄 바꿈 기능으로 동작하죠. 그런데 만약 멀티 라인 입력 필드에서 액션 버튼이 줄 바꿈 외의 다른 액션 버튼으로 동작하게 되면 줄을 바꿀 수 있는 방법이 사라지게 되어 심각한 오동작 상황을 만들 수가 있게 됩니다. 그러므로 이 때는 imeOptions 속성을 사용해도 반영되지 않고 줄 바꿈으로 고정 표시되는 것입니다.


이와 같은 이유로, imeOptions 속성을 시험하기 위해서는 EditText의 "inputType" 속성에 "text" 값을 지정하거나, "singleLine" 속성을 "true"로 지정하여 멀티 라인 입력 기능을 제거해야 합니다.


    <EditText
        ...
        android:inputType="text"
        android:imeOptions="actionDone"
        ... />

또는,

    <EditText
        ...
        android:singleLine="true"
        android:imeOptions="actionDone"
        ... />

아래는 imeOptions 속성 값에 따른 액션 버튼의 표시 모양입니다.
(Google Nexus 7 2세대, Android 6.0 Marshmallow, Google keyboard)

imeOptions에 따른 액션 버튼 모양 (Nexus 7 2세대)


그리고 다른 기기의 액션 버튼 표시 모양은 아래와 같습니다.
(Samsung Galaxy Note 2, Android 4.4 Kitkat, Samsung keyboard)

imeOptions에 따른 액션 버튼 모양 (Galaxy Note 2)


액션 버튼이 눌려졌을 때 수행되는 동작은 EditText의 OnEditorActionListener의 onEditorAction()함수에서 처리할 수 있습니다. 이 때 눌려진 액션 버튼의 종류는 onEditorAction() 함수의 파라미터로 전달되는 "actionId" 변수를 통해 식별할 수 있습니다.

public class MainActivity extends AppCompatActivity {

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

        EditText editText1 = (EditText) findViewById(R.id.editText1) ;
        editText1.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                switch (actionId) {
                    case EditorInfo.IME_ACTION_DONE :
                        // TODO : process "actionDone"
                        System.out.println("actionDone") ;
                        break ;
                }

                return true ;
            }
        });
    }
}

그럼 어떤 경우에 imeOptions 속성과 그에 따른 액션 버튼의 동작을 처리해야 할까요? 몇 가지 앱의 동작 예를 통해 imeOptions 속성의 사용처에 대해 알아보겠습니다.


먼저, 구글 크롬(Chrome) 웹브라우저에서 URL을 입력하는 EditText의 경우를 보죠. 구글 크롬(Chrome) 웹브라우저에서 EditText로 만들어진 주소 입력창에 URL을 입력하고 액션 버튼을 누르면 입력된 URL의 웹 페이지로 이동합니다. 이 때 주소 입력창의 imeOptions이 바로 "actionGo"로 설정되어 있으며, URL 주소를 입력하고 액션 버튼을 누르면 "입력된 주소로 이동"한다는 것을 보여주죠.

imeOptions 속성 예제 - 구글 크롬 웹브라우저 actionGo


또 다른 예로 Daum 검색 창에서 검색어를 입력하는 경우를 들 수 있습니다. 검색창에서 액션 버튼을 누르면 입력된 문자열에 대한 검색이 실행된다는 것을 나타내기 위해, imeOptions 속성에 "actionSearch" 값이 지정될 수 있습니다.

imeOptions 속성 예제 - Daum 검색 actionSearch


imeOptions에 사용 가능한 값 중에는 액션 버튼의 모양 및 동작 설정 외에, 텍스트 편집기(IME) 자체의 옵션을 조절할 수 있는 값들이 있습니다. 이 값들은 단독으로 사용될 수 있고, '|' 기호를 사용하여 "actionNone(0x00000000)" ~ "actionPrevious(0x00000007)" 중 하나의 값과 조합하여 사용할 수도 있습니다.


"flagNoFullscreen" 값은 텍스트 편집기(IME)가 전체화면 모드로 실행되지 않도록 만드는 옵션입니다. 보통 안드로이드 전화기(handset)의 가로 모드에서 EditText의 텍스트 편집기(IME)가 실행되면 전체화면 모드로 표시됩니다. 이 때 "flagNoFullscreen" 값을 사용하면, 전체화면 모드가 아닌 일반 모드로 실행됩니다. (참고로 테블릿에서는 해당사항이 없습니다.)

imeOptions 속성 flagNoFullscreen


"flagNavigatePrevious""flagNavigateNext" 값은 각각 "actionPrevious", "actionNext"와 동일한 기능을 수행하도록 만드는 옵션입니다. 게다가 EditText가 multiline인 경우에도 사용할 수 있도록 해줍니다. (하지만 시험해 본 결과, 모든 경우에 사용 가능한 것은 아니고 전화기(handset)의 가로 모드 전체화면 모드에서만 가능하였습니다.)

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:imeOptions="actionGo|flagNavigateNext" />

imeOptions 속성 flagNavigateNext


"flagNoExtractUi" 값은 텍스트 입력기(IME)가 표시될 때, extracted되지 않은 UI 형태로 출력되도록 만듭니다. 전화기(handset)의 가로 모드에서 텍스트 입력기(IME)가 실행될 때, 다른 View들을 가리는 전체화면 모드로 표시되는데, 이처럼 기본 형태가 아닌 사용 편의에 맞춰진(추출된? extracted?) UI 표시 형태를 아마도 "extracted UI" 라고 지칭하는 것 같습니다. 즉, "flagNoExtractUi"를 사용하면 기본적인 텍스트 입력기(IME) 형태로 실행되는 것이죠. 가로모드-전체화면 모드에서는 "flagNoFullscreen" 값과 동일한 역할을 수행합니다.

imeOptions 속성 flagNoExtractUi


"flagNoAccessoryAction" 값을 사용하면 전화기(handset)의 가로모드에서, 전체화면 모드로 실행된 텍스트 입력기(IME)의 액션 버튼을 보이지 않게 만듭니다. 주로 액션 버튼의 기능을 수행하는 것보다 입력된 텍스트를 보여주는 것이 더 중요하다고 판단되는 상황에서, 유용하게 사용될 수 있습니다.

imeOptions 속성 flagNoAccessoryAction


"flagNoEnterAction" 값은 EditText가 multiline 입력이 아니어도, 텍스트 입력기(IME)의 엔터 버튼이 액션 버튼으로 동작하지 않도록 만들 때 사용합니다.

imeOptions 속성 flagNoEnterAction


"flagForceAscii" 값은 텍스트 입력기(IME)가 ASCII 문자를 입력받을 수 있도록 요청할 때 사용됩니다.

2.1.2 imeActionId와 imeActionLabel 속성

자, imeOptions속성에 대해 살펴보았으니, 이제 다시 imeActionLabel과 imeActionId 속성에 대한 내용으로 돌아가 보겠습니다. 아마도 imeOptions 속성에 대한 설명과 예제를 통해 이 두 가지 속성이 어떤 역할을 수행하는지 감을 잡았을거라 생각이 되네요.

  * android:imeActionId - 액션 버튼이 눌려졌을 때의 이벤트 ID 지정.
        > "100"과 같은 정수 값이어야 함.

  * android:imeActionLabel - 액션 버튼에 표시될 라벨 텍스트 지정.
        > 문자열 텍스트 값 사용.

imeActionLabel 속성은 액션 버튼에 표시되는 문자열을 개발자가 임의로 설정할 때 사용하고, imeActionId 속성은 액션 버튼이 클릭되었을 때 onEditorAction() 함수를 통해 전달되는 actionId 값을 지정할 때 사용합니다.

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText1"
        android:inputType="text"
        android:imeActionId="100"
        android:imeActionLabel="OK!"/>

imeActionId와 imeActionLabel 속성 예제


"OK!" 버튼이 눌려졌을 때, imeActionId 속성에 지정된 값인 "100"이 onEditorAction의 actionId로 전달되며, 아래의 코드와 같이 처리할 수 있습니다.

    EditText editText1 = (EditText) findViewById(R.id.editText1) ;
    editText1.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent e) {
            switch (actionId) {
                case 100 :
                    // TODO : process action button "OK!" (100)
                    System.out.println("OK! action button is pressed.") ;
                    break ;
            }

            return true ;
        }
    });
2.1.3 privateImeOptions 속성.

마지막으로, 텍스트 입력기(IME)의 구현에 한정된(private) 여러 옵션을 변경하기 위해 "privateImeOptions" 속성을 사용할 수 있습니다.

  * android:privateImeOptions - 텍스트 입력기(IME)의 옵션 지정.
        > 문자열 값으로 설정.
        > EditorInfo.privateImeOptions 필드를 통해 전달.

아래의 예제는 구글 키보드를 사용할 때, privateImeOptions 속성을 사용하여 마이크 버튼을 표시하지 않도록 만드는 코드입니다. ("nm" = "no microphone")

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/editText1"
        android:privateImeOptions="nm" />

privateImeOptions 속성 nm


3. 참고.


ANDROID 프로그래밍/EDITTEXT