UGUI InputField 无法唤起键盘

        unity2018.4.18版本存在的bug,在unity2020.3.21版本已修复,具体开始修复的版本未知。bug表现为在点击InputField输入后,点击输入法键盘上的“完成/确定”等字样隐藏键盘(以下称正常方式),可再次点击InputField唤起输入法,不点击输入法键盘上的“完成/确定”等字样,直接点击屏幕上输入法键盘外位置(以下称异常方式),会自动隐藏输入法键盘,此时点击同一个InputField,会无法唤起输入法键盘,无法输入。此时再次点击InputField外其他位置,接着再点击InputField又可以重新唤起键盘输入。

        按照这篇博客https://www.jianshu.com/p/d6989c8ced0a的方案,在OnPointClick中调用EventSystem.SetSelectedGameObject确实可以解决问题,不过也引发了博客中提到的问题,会弹出输入法两次,比较奇怪,于是继续研究,看起来也就是使用异常方式时,这个InputField还是处于选中状态,所以再次点击的时候,会因为代码中对状态的判断导致走不到唤起输入法这一步。此时写一个子类继承InputField脚本,重写函数OnSelect,OnDeselect,不添加任何逻辑,直接调用Base,然后增加一句输出, 然后挂载在InputField上进行测试。测试结果与预期一致,在点击InputField调起输入法时,会调用OnSelect,输入完成后,使用正常方式,此时键盘会收起,并调用OnDeselect函数,但是如果使用异常方式,是不会触发OnDeselect函数的,也就是说这种方式,InputField本身依旧处于选中状态。上面博客的解决办法是在点击时,先把Eventsystem的选中置为Null,然后将InputField设置为选中,这个方法在使用异常方式关闭键盘时确实表现正常,但是在使用正常方式关闭,再次打开时,会出现上面说的输入法弹起两次。

        最初想到的解决方案是,监听异常方式时会不会触发InputField的某个函数,在函数中调用EventSystem.current.SetSelectedGameObject(null)这样的话,就能保证正常唤起输入法了,但是通过对各个函数进行尝试,发现都不会触发到,无果。想到了之所以正常方式下键盘弹起两次,一定是因为在OnPointerClick中调用EventSystem.current.SetSelectedGameObject(null)之前,InputField已经处于选中状态,而此时 先 Set null,再Set Go导致了再次唤起,但是这里加了各种选中判断,也没有效果,于是想到了将Set null提前,即在点击InputField时,在Eventsystem将InputField设置为选中之前,先Set null,可以理解为在点击InputField先将Eventsystem选择状态重置,那么就一定选中这个InputField。经测试,问题解决。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class CustomInputField : InputField
{
    public override void OnPointerDown(PointerEventData eventData)
    {
        EventSystem.current.SetSelectedGameObject(null);//写在所有逻辑之前,一点击就触发
        base.OnPointerDown(eventData);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值