[Android] EditText 의 inputType 을 프로그래밍 방식(programmatically)으로 설정하는 방법 및 총정리
inputType 속성 값 지정 방법
EditText는 TextView를 상속받은 View위젯입니다. inputMethod 속성은 EditText에서 값을 입력할때, 입력방법(input method)의 형태를 지정할때 사용합니다. 텍스트 입력기(IME)를 통해 입력할 수 있는 문자를 제한하거나, 입력방법을 지정하는 속성으로 inputType 속성의 값을 지정할 수 있는 방법은 여러가지가 있습니다. 첫번째 방법은 xml레이아웃에서 직접 설정하는 방법과 안드로이드 스튜디오 UI를 사용하는 방법 그리고 프로그래밍방식으로 처리할 수 있습니다.
inputType 속성값을 어떻게 설정하느냐에 따라 키보드에 표시되는 자판의 키가 달라집니다. 날짜 설정도 유용하게 할 수있으며, 여러모로 알아두면 밸리데이션 체크 로직을 생략할 수 있습니다.
1.XML 레이아웃에서 직접 속성을 지정하는 방법
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondFragment">
<EditText
android:id="@+id/input_second"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="이름을 입력하세요."
android:inputType="textMultiLine|numberDecimal"
android:lines="3"
android:maxLines="3"
android:textColor="@color/colorContent"
android:textColorHint="@color/colorContent"
android:textSize="25sp"
app:layout_constraintBottom_toTopOf="@id/button_second"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/previous"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/input_second" />
</androidx.constraintlayout.widget.ConstraintLayout>
2. 안드로이드 스튜디오 Design > Common Attributes > inputType 속성에서 깃발모양의 아이콘을 클릭하여 설정하는 방법
![](http://playground.naragara.com/wp-content/uploads/2020/12/img-47.png)
3. 프로그래밍 방식으로 처리하는 방법
다음은 코드상에서 처리하는 방법을 알아봅니다. 코드상에서 처리하면 inputType의 값으로 설정가능한 값들에 대한 지정된 변수를 알아야합니다. InputType 인터페이스에 접근하면 정의된 변수들을 확인할 수 있습니다.
[InputType.java]
/**
* Bit definitions for an integer defining the basic content type of text
* held in an {@link Editable} object. Supported classes may be combined
* with variations and flags to indicate desired behaviors.
*
* <h3>Examples</h3>
*
* <dl>
* <dt>A password field with the password visible to the user:
* <dd>inputType = TYPE_CLASS_TEXT |
* TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
*
* <dt>A multi-line postal address with automatic capitalization:
* <dd>inputType = TYPE_CLASS_TEXT |
* TYPE_TEXT_VARIATION_POSTAL_ADDRESS |
* TYPE_TEXT_FLAG_MULTI_LINE
*
* <dt>A time field:
* <dd>inputType = TYPE_CLASS_DATETIME |
* TYPE_DATETIME_VARIATION_TIME
* </dl>
*/
public interface InputType {
public static final int TYPE_MASK_CLASS = 0x0000000f;
public static final int TYPE_MASK_VARIATION = 0x00000ff0;
public static final int TYPE_MASK_FLAGS = 0x00fff000;
public static final int TYPE_NULL = 0x00000000;
public static final int TYPE_CLASS_TEXT = 0x00000001;
public static final int TYPE_TEXT_FLAG_CAP_CHARACTERS = 0x00001000;
public static final int TYPE_TEXT_FLAG_CAP_WORDS = 0x00002000;
public static final int TYPE_TEXT_FLAG_CAP_SENTENCES = 0x00004000;
public static final int TYPE_TEXT_FLAG_AUTO_CORRECT = 0x00008000;
public static final int TYPE_TEXT_FLAG_AUTO_COMPLETE = 0x00010000;
public static final int TYPE_TEXT_FLAG_MULTI_LINE = 0x00020000;
public static final int TYPE_TEXT_FLAG_IME_MULTI_LINE = 0x00040000;
public static final int TYPE_TEXT_FLAG_NO_SUGGESTIONS = 0x00080000;
public static final int TYPE_TEXT_VARIATION_NORMAL = 0x00000000;
public static final int TYPE_TEXT_VARIATION_URI = 0x00000010;
public static final int TYPE_TEXT_VARIATION_EMAIL_ADDRESS = 0x00000020;
public static final int TYPE_TEXT_VARIATION_EMAIL_SUBJECT = 0x00000030;
public static final int TYPE_TEXT_VARIATION_SHORT_MESSAGE = 0x00000040;
public static final int TYPE_TEXT_VARIATION_LONG_MESSAGE = 0x00000050;
public static final int TYPE_TEXT_VARIATION_PERSON_NAME = 0x00000060;
public static final int TYPE_TEXT_VARIATION_POSTAL_ADDRESS = 0x00000070;
public static final int TYPE_TEXT_VARIATION_PASSWORD = 0x00000080;
public static final int TYPE_TEXT_VARIATION_VISIBLE_PASSWORD = 0x00000090;
public static final int TYPE_TEXT_VARIATION_WEB_EDIT_TEXT = 0x000000a0;
public static final int TYPE_TEXT_VARIATION_FILTER = 0x000000b0;
public static final int TYPE_TEXT_VARIATION_PHONETIC = 0x000000c0;
public static final int TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS = 0x000000d0;
public static final int TYPE_TEXT_VARIATION_WEB_PASSWORD = 0x000000e0;
public static final int TYPE_CLASS_NUMBER = 0x00000002;
public static final int TYPE_NUMBER_FLAG_SIGNED = 0x00001000;
public static final int TYPE_NUMBER_FLAG_DECIMAL = 0x00002000;
public static final int TYPE_NUMBER_VARIATION_NORMAL = 0x00000000;
public static final int TYPE_NUMBER_VARIATION_PASSWORD = 0x00000010;
public static final int TYPE_CLASS_PHONE = 0x00000003;
public static final int TYPE_CLASS_DATETIME = 0x00000004;
public static final int TYPE_DATETIME_VARIATION_NORMAL = 0x00000000;
public static final int TYPE_DATETIME_VARIATION_DATE = 0x00000010;
public static final int TYPE_DATETIME_VARIATION_TIME = 0x00000020;
}
프로그래밍방식으로 inputType속성으로 “numberDecimal”를 설정하고 싶은 경우 아래 코드 스니펫과 같이 처리합니다.
android:inputType에 하나 이상의 상수 값( constant values )을 설정하고 싶은 경우 구분자로 “|”를 사용하여 처리합니다.
//numberDecimal
searchView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
//number
searchView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL);
■[actionBar의 검색아이콘 사용시 MenuItem의 editText의 inputType를 설정하는 방법
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
//검색바 컨트롤
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); //numberDecimal
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
NavController navController = Navigation.findNavController(MainActivity.this, R.id.nav_host_fragment);
Bundle args = new Bundle();
args.putString("PARAM", query);
navController.navigate(R.id.FirstFragment, args); //navigation에 있는 ID를 적용해야한다.
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
//입력할때마다 반응
return false;
}
});
return true;
}
■android:inputType
Contant | Value | Decription |
date | 14 | 날짜를 입력합니다.
InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE |
datetime | 4 | 날짜와 시간을 입력합니다
InputType.TYPE_CLASS_DATETIME | |
none | 0 | 콘텐츠 유형이 없습니다. 텍스트는 편집 할 수 없습니다. |
number | 2 | 숫자 전용 필드입니다.
InputType.TYPE_CLASS_NUMBER | |
numberDecimal | 2002 | 소수 (분수) 숫자를 허용하기 위해 숫자 및 기타 옵션과 결합 할 수 있습니다 .
InputType.TYPE_CLASS_NUMBER | |
numberPassword | 12 | 숫자 암호 필드입니다
InputType.TYPE_CLASS_NUMBER | |
numberSigned | 1002 | 숫자 및 기타 옵션과 결합 하여 부호있는 숫자를 허용 할 수 있습니다
InputType.TYPE_CLASS_NUMBER | |
phone | 삼 | 전화 번호를 입력합니다.
InputType.TYPE_CLASS_PHONE |
text | 1 | 평범한 오래된 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textAutoComplete | 10001 | 이 필드가 자체 자동 완성을 수행하고 입력 방법과 적절하게 통신하도록 지정하기 위해 텍스트 및 해당 변형과 결합 할 수 있습니다
InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE |
textAutoCorrect | 8001 | 텍스트 및 그 변형과 결합하여 입력중인 텍스트의 자동 수정을 요청할 수 있습니다
InputType.TYPE_TEXT_FLAG_AUTO_CORRECT |
textCapCharacters | 1001 | 텍스트 및 변형과 결합하여 모든 문자의 대문자를 요청할 수 있습니다
InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS |
textCapSentences | 4001 | 텍스트 및 변형과 결합하여 모든 문장의 첫 번째 문자를 대문자로 요청할 수 있습니다
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES |
textCapWords | 2001 | 텍스트 및 해당 변형과 결합하여 모든 단어의 첫 번째 문자의 대문자를 요청할 수 있습니다 .
InputType.TYPE_TEXT_FLAG_CAP_WORDS |
textEmailAddress | 21 | 이메일 주소로 사용될 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textEmailSubject | 31 | 이메일 제목으로 제공되는 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textFilter | b1 | 다른 데이터를 필터링하는 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textImeMultiLine | 40001 | 일반 텍스트보기가 여러 줄이되어서는 안되지만 IME는 가능한 경우 여러 줄을 제공해야 함을 나타 내기 위해 텍스트 및 해당 변형과 결합 할 수 있습니다.
InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE |
textLongMessage | 51 | 긴 메시지의 내용 인 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textMultiLine | 20001 | 텍스트 및 해당 변형과 결합 하여 필드에 여러 줄의 텍스트를 허용 할 수 있습니다 . 이 플래그를 설정하지 않으면 텍스트 필드가 한 줄로 제한됩니다.
InputType.TYPE_TEXT_FLAG_MULTI_LINE |
textNoSuggestions | 80001 | IME가 사전 기반 단어 제안을 표시하지 않아야 함을 나타 내기 위해 텍스트 및 해당 변형과 결합 할 수 있습니다 . 에 해당합니다 .
InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS |
textPassword | 81 | 암호 인 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textPersonName | 61 | 사람의 이름 인 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textPhonetic | c1 | 연락처 항목의 음성 이름 필드와 같이 음성 발음 용 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textPostalAddress | 71 | 우편 주소로 제공되는 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textShortMessage | 41 | 짧은 메시지의 내용 인 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textUri | 11 | URI로 사용될 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textVisiblePassword | 91 | 표시되어야하는 비밀번호 텍스트입니다.
InputType.TYPE_CLASS_TEXT | |
textWebEditText | a1 | 웹 양식에서 텍스트로 제공되는 텍스트입니다.
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT |
textWebEmailAddress | d1 | 웹 양식에서 이메일 주소로 사용될 텍스트입니다.
.InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS |
textWebPassword | e1 | 웹 양식에서 비밀번호로 사용할 텍스트입니다.
InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD |
time | 24 | 시간을 입력합니다.
InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME 관련 방법 : |
[REFERENCE]
https://developer.android.com/reference/android/widget/TextView.html#attr_android:inputType
developer.android.com/guide/topics/text/creating-input-method
[다른 글 더보기]
[프로그래밍/Android] – [Android] EditText 읽기전용 (readonly)