오늘은 안드로이드 EditText의 inputType이 제대로 적용 안 되는 오류 해결 방법에 대해 알아보겠습니다.
아마도 다양한 문제 상황이 있을 것으로 생각하는데, 저 같은 경우는 numberDecimal이 잘 동작하지 않아서 문제를 겪었습니다.
여러모로 고민하다가 몇 가지 방법을 찾아냈는데, 여러분과 공유하고자 합니다.
문제 상황
MainActivity의 XML 코드입니다. 간단하게 TextView와 EditText로 구성했습니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Input Test : "
android:textSize="25sp"
android:layout_margin="10dp"/>
<EditText
android:id="@+id/et_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="test"
android:inputType="numberDecimal"
android:textSize="25sp"
android:layout_margin="10dp" />
</LinearLayout>
EditText의 inputType에 numberDecimal을 설정해주었습니다.
numberDecimal은 부호 없는 소수점을 포함한 숫자만 입력할 수 있습니다. 즉, 0~9와 . (점 문자)만 사용 가능합니다.
그런데 다음과 같이 콤마나 마이너스, 공백 기호 등이 입력 가능한 것을 확인할 수 있습니다.
여러 상황을 테스트해보면서 크게 2가지의 해결 방법을 찾아냈습니다.
첫 번째는 build.gradle의 dependencies를 수정하는 방법이고, 두 번째는 코드상에서 동적으로 속성을 지정해주는 방법입니다. 이를 하나씩 소개하겠습니다.
build.gradle의 dependencies를 수정하기
이 방법은 스택오버플로우에서 저와 같은 문제를 겪는 사례를 발견하여 알게 된 해결 방법입니다.
문제 해결을 위해서는 build.gradle의 dependencies를 수정해야 합니다.
저 같은 경우는 다음과 같이 dependencies가 설정되어 있었는데요.
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
appcompat 버전을 1.4.0에서 1.3.1로 변경하면 됩니다.
수정 후 다시 테스트해보면 잘 동작하는 것을 확인할 수 있습니다.
dependencies의 다른 라이브러리를 최신 버전으로 변경한 후에도 테스트해보았는데요, 이 경우에도 잘 동작합니다.
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
아마도 여러 가지 버전 사이에서 무언가 충돌이 생겨 속성이 제대로 적용되지 않는 것 같습니다. 본인의 라이브러리 버전을 확인하고 상황에 맞게 수정하시기 바랍니다.
코드상에서 동적으로 속성을 지정하기
만약 꼭 특정한 버전의 라이브러리를 사용해야 한다면 동적으로 코드상에서 inputType을 지정해주는 방법도 있습니다.
다음과 같이 설정하게 되면 inputType이 정상적으로 동작합니다.
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.InputType
import com.example.myapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.etTest.inputType = (InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)
}
}
EditText 객체의 inputType에 직접 (InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL) 를 대입하여 numberDecimal로 동작하도록 한 것입니다.
분명 XML에서 설정했을 때는 안 되는데, 코드상에서 지정해주면 잘 돌아간다 점이 의아하긴 하지만 어쨌든 정상적으로 작동합니다.
이 문제 해결하느라 한참 구글링하고 고생이 많았는데, 한글 자료가 없어서 더욱더 힘들었습니다. 다른 분들은 위 방법 사용하여 쉽게 문제 해결하시기 바랍니다.
'모바일 > 안드로이드' 카테고리의 다른 글
[안드로이드 스튜디오] 시스템 UI가 응답하지 않음 해결 방법 (0) | 2022.02.09 |
---|