UGUI原生的InputField组件,有OnEndEdit事件可以监听,但是有个问题:点击屏幕其它区域也会触发,不只是点“确定”、“前往”、“搜索”等键盘按钮时。这有可能不是我们希望的。看过一些帖子,直接重写InputField组价OnSubmit方法,也是不行的。最后发现它有个_keyboard变量,可以根据它的status状态值来实现:只有点“确定”、“前往”、“搜索”等键盘按钮时,才会触发。但是protected。于是可以这么继承扩展。
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.UI;
/*
* Author:W
* 扩展文本输入框组件
*/
public class CustomInputField : InputField {
/// <summary>
/// 屏幕键盘对象获取
/// </summary>
public TouchScreenKeyboard TouchScreenKeyboard
{
get
{
return m_Keyboard;
}
}
}
扩展文本框测试使用代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
* Author:W
* 文本输入框改造
* 1.点击屏幕其它区域,不会触发OnSubmit提交事件,只是隐藏弹出的输入键盘。
* 2.只有点击输入键盘上的“确定”/"前往"按钮时,才会触发提交事件,与此同时隐藏弹出的输入键盘
*/
public class InputFieldTest : MonoBehaviour {
private CustomInputField customInputField;
public int CharacterLimit = 10;
void Awake()
{
customInputField = this.GetComponent<CustomInputField>();
customInputField.characterLimit = CharacterLimit;
customInputField.onEndEdit.AddListener(OnEndEdit);
}
/// <summary>
/// 用户结束输入时:
/// 1.点击屏幕其它区域时触发
/// 2.点击键盘上的“确定”/"前往"按钮时触发
/// </summary>
/// <param name="res"></param>
private void OnEndEdit(string res)
{
Debug.Log("WLQ 点击屏幕其它区域、确定按钮、前往按钮 都会触发提交");
}
// Update is called once per frame
void Update () {
if (customInputField == null || customInputField.TouchScreenKeyboard == null) return;
//当屏幕键盘切换到“Done”状态时,才会提交。即只有点击键盘上的“确定”/“前往”按钮时触发。
if (customInputField.TouchScreenKeyboard.status == TouchScreenKeyboard.Status.Done)
{
Debug.LogError("WLQ 只有点击键盘上的“确定”/“前往”按钮时触发提交");
}
}
}
运行结果如下