/// <summary>
/// Unity - Android) InputField 와 친해지기 (part. 1)
/// @author : CloudD
/// @last update : 2023. 06. 30
/// @update
/// - 2023. 06. 30 : 최초 작성.
/// </summary>
Unity 에서 모바일 UI 를 개발하다 보면 유난히 InputField 가 아쉽게 느껴질 때가 많습니다.
개인적으로 가장 큰 문제라고 느꼈던 부분은
작성할 것을 다 쓰고, Soft Keyboard 를 닫기 위해서 하단의 ' V ' 키를 누르면
모든 내용이 사라지는 것 이라고 생각합니다.
![]() |
multi line editing 을 하다보면 '완료' 버튼이 없어서 v 버튼을 누르게 되는데 그걸 누르면, 모든 내용이 사라진답니다... |
저는 이 문제를 InputField 에 event listener 를 추가해서 해결했습니다.
InputField 를 터치할 때 발생하는 onSelect() 에서는 현재 입력된 값이 있는지 확인합니다.
값이 변경될 때 발생하는 onValueChanged() 에서는 string 변수에 변경되는 값을 저장합니다.
입력이 끝나고 Soft keyboard 의 상태가 변화될 때 발생하는 onTouchScreenKeyboardStatusChanged() 에서는 Soft keyboard 의 상태를 확인합니다.
마지막으로 InputField 의 사용이 끝날 때 발생하는 onDeselect() 에서 Soft keyboard 가 취소 상태라면 가장 마지막에 변경된 값을 InputField 에 입력합니다.
이걸 코드로 풀어내면 이렇게 사용할 수 있습니다.
이제 InputField 를 추가할 때 마다 SetInputFieldListener() 를 한 번 호출해주면
위의 문제가 해결됩니다.
private bool keepOldTextInField; | |
private string oldText; | |
private string editText; | |
public void SetInputFieldListener(TMP_InputField input) | |
{ | |
input.onSelect.AddListener(OnSelect); | |
input.onValueChanged.AddListener(OnValueChanged); | |
input.onTouchScreenKeyboardStatusChanged.AddListener(OnStatusChanged); | |
input.onDeselect.AddListener((value) => { | |
if (keepOldTextInField) | |
{ | |
input.text = oldText; | |
keepOldTextInField = false; | |
} | |
}); | |
} | |
private void OnSelect(string currentText) | |
{ | |
oldText = currentText; | |
} | |
private void OnValueChanged(string currentText) | |
{ | |
oldText = editText; | |
editText = currentText; | |
} | |
private void OnStatusChanged(TouchScreenKeyboard.Status status) | |
{ | |
if (status == TouchScreenKeyboard.Status.Canceled) | |
{ | |
keepOldTextInField = true; | |
} | |
} |
event listener 를 추가한 영상과 함께 이번 글을 마무리 하도록 하겠습니다.
혹시 제가 틀렸거나, 더 좋은 방법을 알고 계시는 분이 있다면 댓글에 의견 남겨주세요.
의견 반영해서 다시 업데이트 하도록 하겠습니다.
긴 글 읽어주셔서 감사합니다.
다음에 더 좋은 글 가지고 오겠습니다.