안드로이드 개발자의 창고
[28일차 Android] EditText 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 EditText
- 사용자에게 문자열 데이터를 입력을 받을 때 사용하는 View
주요 속성
속성 | 설명 |
text | EditText에 표시할 문자열 설정 |
hint | 입력된 값이 없을 경우 표시할 안내 문구 설정 |
inputType | 입력 값에 대한 설정. 표시되는 형식, 나타나는 키보드 등에 영향을 준다. |
imeOptions | 나타나는 키보드의 Enter 키 모양 설정 |
이벤트
이벤트 | 설명 |
TextWatcher | 사용자가 입력한 내용을 실시간으로 감시 |
EditorAction | 키보드의 Enter 키를 눌렀을 때 발생하는 이벤트 |
예제 코드
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editTextText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text"
android:text="Name" />
<EditText
android:id="@+id/editTextTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="입력해주세요"
android:inputType="textPassword" />
<EditText
android:id="@+id/editTextTextEmailAddress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textEmailAddress" />
<EditText
android:id="@+id/editTextTextMultiLine"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="start|top"
android:inputType="textMultiLine" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="문자열 가져오기" />
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
</LinearLayout>
MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.SystemClock
import android.text.Editable
import android.text.TextWatcher
import android.view.inputmethod.InputMethodManager
import androidx.core.widget.addTextChangedListener
import com.test.android12_edittext.databinding.ActivityMainBinding
import kotlin.concurrent.thread
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run {
thread {
SystemClock.sleep(500);
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(currentFocus, 0);
}
editTextText.run{
setText("코드에서 문자열 설정")
requestFocus()
setOnEditorActionListener { textView, i, keyEvent ->
textView.text = "엔터 버튼을 눌렀습니다"
textView2.text = text.toString()
false
}
val editTextWatcher1 = EditTextWatcher1()
addTextChangedListener(editTextWatcher1)
}
editTextTextPassword.run{
addTextChangedListener {
textView.text = it
}
}
button.run {
setOnClickListener {
val str1 = editTextText.text.toString()
textView.text = str1
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
if (currentFocus != null){
imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)
currentFocus!!.clearFocus()
}
}
}
}
}
inner class EditTextWatcher1 : TextWatcher{
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
activityMainBinding.textView.text = "before : ${s}"
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
activityMainBinding.textView2.text = "changed : ${s}"
}
override fun afterTextChanged(s: Editable?) {
activityMainBinding.textView3.text = "after : ${s}"
}
}
}
코드 리뷰
- thread{ ... }
- thread의 내부 코드는 view와 연결되는 키보드를 올라오게 하는 코드이다.
- onCreate()가 끝나야 키보드가 올라오지만 그 전에 키보드를 올라오게 하기 때문에 thread로 작성하지 않으면 무시된다.
- SystemClock.sleep(500)
- 500ms 쉬게 한다.
- onCreate()가 끝날 때까지 대기하도록 하기 위함이다.
- imm.showSoftInput(currentFocus, 0);
- 키보드가 올라오게 설정한다.
- editTextText.run{ ... }
- requestFocus() : editTextText에 포커스를 준다.
- setOnEditorActionListener { ... }
- true : 엔터 키 누른 후에 포커스가 현재 EditText로 유지된다.
- false : 엔터 키를 누른 후에 다음 EditText로 포커스가 이동한다.
- addTextChangedListener(editTextWatcher1)
- inner class로 작성한 EditText 입력 감시자(TextWatcher)를 사용하여 설정한다.
- inner class EditTextWatcher1 : TextWatcher{ ... }
- TextWatcher 인터페이스는 3가지의 함수를 오버라이딩 해야 한다.
- beforeTextChanged : 입력 내용 변경 전
- onTextChanged : 입력 내용 변경했을 때
- afterTextChanged : 입력 내용 변경된 후
- editTextTextPassword.run{ ... }
- addTextChangedListener { ... }
- addTextChangedListener를 사용할 때 고차 함수를 사용하면 TextWatcher의 after 역할을 수행한다.
- 즉 실시간으로 사용자의 입력 내용을 받아낼 수 있다.
- addTextChangedListener { ... }
- button.run { ... }
- onSetClickListener{ ... }
- if (currentFocus != null){ ... }
- currentFocus를 사용하여 현재 포커스를 가지고 있는 view를 지정한다.
- 즉 포커스를 가지고 있는 view가 있다면 키보드를 내리고 포커스를 해제한다.
- onSetClickListener{ ... }
결과
'Computer > Android' 카테고리의 다른 글
[29일차 Android] TextInputLayout (1) | 2023.06.10 |
---|---|
[28일차 Android] LogCat (0) | 2023.06.10 |
[28일차 Android] Button (0) | 2023.06.10 |
[28일차 Android] TextView (0) | 2023.06.10 |
[28일차 Android] Space (0) | 2023.06.10 |