[Unity/Android] InputField 와 친해지기 (part. 1)

/// <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 를 추가한 영상과 함께 이번 글을 마무리 하도록 하겠습니다.



혹시 제가 틀렸거나, 더 좋은 방법을 알고 계시는 분이 있다면 댓글에 의견 남겨주세요.

의견 반영해서 다시 업데이트 하도록 하겠습니다.


긴 글 읽어주셔서 감사합니다.

다음에 더 좋은 글 가지고 오겠습니다.

CloudD

예술하는 프로그래머, 코딩하는 예술가

댓글 쓰기

다음 이전