모바일/안드로이드

[안드로이드] EditText inputType 오류 해결 방법

호무비 2022. 1. 19. 01:16
반응형

오늘은 안드로이드 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를 수정하기

 

이 방법은 스택오버플로우에서 저와 같은 문제를 겪는 사례를 발견하여 알게 된 해결 방법입니다.

 

Input type is not working properly

I have certain number of edittexts in my activity and I specified each edittext with input type :"number" In order to show the keyboard only with numbers. when I click on the edittext initially it ...

stackoverflow.com

 

문제 해결을 위해서는 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에서 설정했을 때는 안 되는데, 코드상에서 지정해주면 잘 돌아간다 점이 의아하긴 하지만 어쨌든 정상적으로 작동합니다.

 


이 문제 해결하느라 한참 구글링하고 고생이 많았는데, 한글 자료가 없어서 더욱더 힘들었습니다. 다른 분들은 위 방법 사용하여 쉽게 문제 해결하시기 바랍니다.

반응형