[Android] Kotlin에서 editText 텍스트 설정 안 되는 이유 & 방법

new Dean( );·2021년 9월 17일
2

안드로이드

목록 보기
1/2

문제상황

class SetTextActivity : AppCompatActivity() {
    lateinit var binding: ActivitySetTextBinding
    override fun onCreate(savedInstanceState: Bundle?) {
    	...

        /**
         * editTextOutput은 editText의 id이다.
         * input은 String이다.
         */
      	editTextOutput.text = input
    }
}

위의 방법으로 EditText의 text를 설정하려는 데 아래와 같이 에러가 발생했다.

Type mismatch.
Required: Editable!
Found: String

원인

Editable type이 들어가야 하는데, String을 넣어서 타입이 맞지 않았다.

Editable
This is the interface for text whose content and markup can be changed (as opposed to immutable text like Strings)
내용이나 마크업이 변경될 수 있는 텍스트(String과 반대)를 위한 인터페이스

T!
T 또는 T?를 의미한다. 'null이 될 수도~ 안 될 수도~'
즉, T타입의 널 가능성에 대해 아무 정보도 없다는 뜻이다.


해결 방법

1. setter를 사용한다.

editTextOutput.setText(input)

2. Editable형태로 바꿔서 대입한다.

editTextOutput2.text = Editable.Factory.getInstance().newEditable(input)

🤔 남아있는 의문점

왜 문제상황과 1번(setter)이 차이가 나는지 모르겠다.

디컴파을 해보았다.

코틀린 코드 (원본)

val input = binding.editTextInput.text.toString()

val editTextOutput = findViewById<EditText>(R.id.editTextOutput)
val editTextOutput2 = findViewById<EditText>(R.id.editTextOutput2)

// 0. 속성에 직접 대입 (X : Type Mismatch)
editTextOutput.text = input

// 1. setter 사용 (O)
editTextOutput.setText(input)

// 2. Editable 형태로 바꾸기 (O)
editTextOutput2.text = Editable.Factory.getInstance().newEditable(input)

자바 코드 (디컴파일)

EditText var5 = var10000.editTextInput;
Intrinsics.checkNotNullExpressionValue(var5, "binding.editTextInput");
String input = var5.getText().toString();

EditText editTextOutput = (EditText)this.findViewById(1000360);
EditText editTextOutput2 = (EditText)this.findViewById(1000135);


Intrinsics.checkNotNullExpressionValue(editTextOutput, "editTextOutput");

// 0. 속성에 직접 대입 (X : Type Mismatch)
editTextOutput.setText((CharSequence)input);

// 1. setter 사용 (O)
editTextOutput.setText((CharSequence)input);


Intrinsics.checkNotNullExpressionValue(editTextOutput2, "editTextOutput2");

// 2. Editable 형태로 바꾸기 (O)
editTextOutput2.setText((CharSequence)Factory.getInstance().newEditable((CharSequence)input))

0번과 1번 둘 다 CharSequence로 형변환해서 setter를 통해 데이터가 바뀌는 것 같은데 왜 결과가 반대인지 모르겠다.

0개의 댓글