Unity3d InputField在手机上的焦点问题

Unity3d 2017在Android设备上,InputField在软键盘关闭后无法再次唤出。通过分析源码,发现在OnPointerDown和MayDrag函数中的m_Keyboard判断导致问题。解决方案是重写相关函数,确保在点击输入框时正确设置isFocused状态,以重新激活InputField。
摘要由CSDN通过智能技术生成

Unity3d 2017的InputField在手机上会有奇怪的表现

当点击输入框时,会呼唤出软键盘。此时点击软键盘外收回软键盘,再次点击输入框,无法将软键盘唤出。只有先点击其他位置,在点击输入框才能重新呼唤出软键盘

查找原因

猜测是第一次点击收回软键盘的时候没有取消掉InputField上的焦点。最初的尝试是监听onEndEdit接口,然后调用DeactivateInputField()接口去取消

        mInput.onEndEdit.AddListener(delegate
        {
   
            mInput.DeactivateInputField();
        });

结果发现还是不行,打了断点发现根本没有走进onEndEdit的监听事件里

重载源码

看了下InputField的源码,才发现OnPointerDown函数中有很多坑,这里贴上源码给大家先看一下

public override void OnPointerDown(PointerEventData eventData)
        {
   
            if (!MayDrag(eventData))
                return;

            EventSystem.current.SetSelectedGameObject(gameObject, eventData);

            bool hadFocusBefore = m_AllowInput;
            base.OnPointerDown(eventData);

            if (!InPlaceEditing())
            {
   
                if (m_Keyboard == null || !m_Keyboard.active)
                {
   
                    OnSelect(eventData);
                    return;
                }
            }

            // Only set caret position if we didn't just get focus now.
            // Otherwise it will overwrite the select all on focus.
            if (hadFocusBefore)
            {
   
                Vector2 localMousePos;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(textComponent.rectTransform, eventData.position, eventData.pressEventCamera, out localMousePos);

                caretSelectPositionInternal = caretPositionInternal = 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值