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

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被修改。
相关推荐
avi91119 天前
【大神系列】TextMeshPro打包问题,和Lighing2D 光插件
textmeshpro·tmp·resource目录·unity打包
qiminixi17 天前
UGUI 滚动视图结构
scrollrect·ugui·滚动视图
神码编程3 个月前
【Unity】 HTFramework框架(七十)MultiChoiceDropdown可多选的下拉菜单
unity·游戏引擎·ugui·dropdown·下拉菜单
小贺儿开发5 个月前
Unity3D 图片循环查看器
unity·工具·图片·列表·循环·ugui·互动
小贺儿开发5 个月前
Unity UGUI 可视化热区编辑与交互系统
unity·编辑器·游戏引擎·交互·工具·适配·ugui
君莫愁。6 个月前
【Unity】解决UGUI的Button无法点击/点击无反应的排查方案
unity·c#·游戏引擎·解决方案·ugui·按钮·button
一只一只10 个月前
Unity之UGUI Button按钮组件详细使用教程
unity·游戏引擎·ugui·button·ugui button
wonder1357910 个月前
UGUI重建流程和优化
unity·游戏开发·ugui
wonder135791 年前
RectTransform位置计算方法和UI自适应
ui·unity·ugui