Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[28일차 Android] EditText 본문

Computer/Android

[28일차 Android] EditText

Wise-99 2023. 6. 10. 05:01

 

 

출처 : 안드로이드 앱스쿨 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 역할을 수행한다.
      • 즉 실시간으로 사용자의 입력 내용을 받아낼 수 있다.

 

  • button.run { ... }
    • onSetClickListener{ ... }
      • if (currentFocus != null){ ... }
      • currentFocus를 사용하여 현재 포커스를 가지고 있는 view를 지정한다.
      • 즉 포커스를 가지고 있는 view가 있다면 키보드를 내리고 포커스를 해제한다.

 

 

 

결과

 

'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