TMP_InputField 在Android上,有三种方式可以关闭虚拟键盘:
- 使用虚拟键盘的关闭按钮。
- 输入框失去焦点。
- 使用手机的返回键。
前两个都没有问题,但使用返回键,会自动恢复到上一次的内容------比如,之前是使用前两个方式关闭的虚拟键盘,就会记住这关闭时的文本内容,也就是将文本内容text 保存到touchScreenKeyboard.text。
但为什么手机返回键,就不能保存文本呢?------取消了面板属性的ResetOnDeActivation 与RestoreOriginalTextOnEscape也不行。
经过排查源代码发现,问题出在LateUpdate 之中的this.text = m_SoftKeyboard.text。
cs
protected virtual void LateUpdate()
{
if (m_SoftKeyboard == null || m_SoftKeyboard.status != TouchScreenKeyboard.Status.Visible)
{
if (m_SoftKeyboard != null)
{
if (!m_ReadOnly)
{
this.text = m_SoftKeyboard.text;
}
TouchScreenKeyboard.Status status = m_SoftKeyboard.status;
if (m_LastKeyCode != KeyCode.Return && status == TouchScreenKeyboard.Status.Done && isUWP())
{
status = TouchScreenKeyboard.Status.Canceled;
m_IsKeyboardBeingClosedInHoloLens = true;
}
switch (status)
{
case TouchScreenKeyboard.Status.LostFocus:
SendTouchScreenKeyboardStatusChanged();
break;
case TouchScreenKeyboard.Status.Canceled:
m_ReleaseSelection = true;
m_WasCanceled = true;
SendTouchScreenKeyboardStatusChanged();
break;
case TouchScreenKeyboard.Status.Done:
m_ReleaseSelection = true;
SendTouchScreenKeyboardStatusChanged();
OnSubmit(null);
break;
}
}
return;
}
}
可以看到,当m_SoftKeyboard.status != TouchScreenKeyboard.Status.Visible 时,文本框的内容会被键盘的内容覆盖------而手机返回键,将会触发虚拟键盘进入TouchScreenKeyboard.Status.Canceled状态。
有趣的是,this.text 与m_SoftKeyboard.text 一直都是同步的,但当TouchScreenKeyboard.Status.Canceled 状态时,m_SoftKeyboard.text 会被重置为上次内容,并且就算直接修改m_SoftKeyboard.text内容也无效。
因此,修正这个问题有两个方式:
- 第一,是在TouchScreenKeyboard.Status.Canceled 状态时,手动设置this.text。
- 第二,是在TouchScreenKeyboard.Status.Canceled 状态时,使得m_ReadOnly 为true ,从而阻止this.text被修改。