【问题标题】:Hide Virtual keyboard when using InputField使用 InputField 时隐藏虚拟键盘
【发布时间】:2018-02-04 10:10:21
【问题描述】:

我知道如何使用InputMethodManager 隐藏或显示虚拟键盘。

但我想使用物理键盘在EditText 中输入文本,但我不想在 Unity 3D Android 中显示虚拟键盘。

如何在 Unity 3D 中做到这一点?

【问题讨论】:

    标签: c# android unity3d


    【解决方案1】:

    Unity 中没有 EditText 这样的东西。 InputField 用于接收来自设备的输入。

    您可以在 Android 上使用 InputField 禁用虚拟关键字。不确定这是否适用于其他平台。

    你的输入框:

    public InputField inputField;
    

    禁用虚拟键盘:

    inputField.keyboardType = (TouchScreenKeyboardType)(-1);
    

    启用虚拟键盘:

    inputField.keyboardType = TouchScreenKeyboardType.Default;
    

    如果您遇到奇怪的问题,请考虑从InputField 派生脚本,然后禁用虚拟键盘,最后调用InputField 的基本Start 函数:

    public class HideVirtualKeyboard : InputField
    {
        protected override void Start()
        {
            keyboardType = (TouchScreenKeyboardType)(-1);
            base.Start();
        }
    }
    

    【讨论】:

    • 我不认为这是处理它的正确方法。我自己试过这个,它抑制了前面提到的键盘。然后我构建了一个 Android 应用程序进行测试,启动了好的 ol' adb logcat,发现我的终端被索引越界异常淹没了。
    • @Esper 这就是我喜欢 SO 的原因。你总是可以改进答案。如果您知道实际可行的“正确”方法,请提供答案。
    • 你是对的,我说这不是“正确”的做法是错误的,因为没有解决这个特定问题的“正确”方法。我应该说的是,这不是一个可行的解决方案,因为它会在运行时产生错误。
    • 没问题。这解决了问题,但在 Unity 添加官方属性或函数之前只是一种解决方法。在那之前,我们一直坚持这一点。在撰写本文时没有收到任何错误日志。也许 Unity 中的情况发生了变化,但我认为该错误不会阻止您的游戏运行。
    【解决方案2】:

    我知道的老问题,但你真正想要的是设置inputField.touchScreenKeyboard.active = false; 你可能需要在LateUpdate 中保持它为假

    [SerializeField] 
    private bool keyboardEnabled = true;
    // toggle this to toggle native keyboard activity
    public bool KeyboardEnabled { get { return keyboardEnabled; } set { keyboardEnabled = value; } }
    
    private void LateUpdate()
    {
    #if UNITY_ANDROID
        if (inputField.touchScreenKeyboard != null && !keyboardEnabled)
        {
            inputField.touchScreenKeyboard.active = false;
        }
    #endif
    }
    

    【讨论】:

    • 在一个我从不想看到系统键盘的 VR 应用程序中,我将这些行放在 Application.onBeforeRender: var ev = EventSystem.current; if (ev != null) { var go = ev.currentSelectedGameObject; if (go != null) { var inp = go.GetComponent<InputField>(); if (inp != null && inp.touchScreenKeyboard != null) inp.touchScreenKeyboard.active = false; } }
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多