「Unity3D」TextMeshPro的TMP_InputField在Android上使用返回键关闭虚拟键盘,会清空文本或恢复上次内容的问题

TMP_InputFieldAndroid上,有三种方式可以关闭虚拟键盘:

  • 使用虚拟键盘的关闭按钮。
  • 输入框失去焦点。
  • 使用手机的返回键。

前两个都没有问题,但使用返回键,会自动恢复到上一次的内容------比如,之前是使用前两个方式关闭的虚拟键盘,就会记住这关闭时的文本内容,也就是将文本内容text 保存到touchScreenKeyboard.text

但为什么手机返回键,就不能保存文本呢?------取消了面板属性的ResetOnDeActivationRestoreOriginalTextOnEscape也不行。

经过排查源代码发现,问题出在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.textm_SoftKeyboard.text 一直都是同步的,但当TouchScreenKeyboard.Status.Canceled 状态时,m_SoftKeyboard.text 会被重置为上次内容,并且就算直接修改m_SoftKeyboard.text内容也无效。

因此,修正这个问题有两个方式:

  • 第一,是在TouchScreenKeyboard.Status.Canceled 状态时,手动设置this.text
  • 第二,是在TouchScreenKeyboard.Status.Canceled 状态时,使得m_ReadOnlytrue ,从而阻止this.text被修改。
相关推荐
wonder135795 天前
UGUI合批分析和优化方法整理
unity·ugui
wonder135795 天前
UGUI鼠标点击到按钮响应流程的源码分析
unity·ugui
@LYZY1 个月前
Unity TextMeshPro 文本对齐方式详解
unity·游戏引擎·textmeshpro·tmp
神码编程7 个月前
【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表
unity·游戏引擎·ugui
scott.cgi7 个月前
「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩
unity·ugui·textmeshpro·tmp_inputfield·inputfield高度自动化·unity输入框高度扩展·textmeshpro高度扩展
scott.cgi8 个月前
「Unity3D」TextMeshPro中的TMP_InputField,用来实现输入框的几个小问题
unity·ugui·textmeshpro·tmp_inputfield·inputfield·inputfield输入框·ugui输入框
scott.cgi9 个月前
「Unity3D」UGUI运行时设置元素的锚点Anchor,维持元素Rect的显示不变,即待在原处
ugui·ugui改变anchor·ugui改变锚点保持原样·ugui代码改变anchor·ugui运行时设置锚点·ugui保持元素不变
龚子亦1 年前
Unity学习之UGUI进阶
学习·unity·游戏引擎·ugui
Leoysq1 年前
【UGUI】实现点击注册按钮跳转游戏场景
游戏·unity·游戏引擎·ugui