You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity从2020升级至2022 LTS后Android软键盘缺失OK按钮

解决方案:Unity 2022多行TMP_InputField Android13软键盘缺失OK按钮问题

针对你升级Unity到2022.3.35f1后,Android13设备上多行TMP_InputField软键盘无OK按钮的问题,以下是几种可行的代码修复方案:

方案1:修改TMP_InputField的InputType属性

通过代码为多行输入框强制添加SubmitDone输入类型,让Android输入法显示完成按钮:

using UnityEngine;
using TMPro;

public class MultilineKeyboardFixer : MonoBehaviour
{
    void Awake()
    {
        // 遍历场景中所有TMP_InputField
        foreach (var inputField in FindObjectsOfType<TMP_InputField>())
        {
            // 仅处理多行换行类型的输入框
            if (inputField.lineType == TMP_InputField.LineType.MultiLineNewline)
            {
                // 保留原有输入类型,追加完成按钮标记
                inputField.inputType |= TMP_InputField.InputType.SubmitDone;
                // 强制更新输入框配置
                inputField.ForceLabelUpdate();
            }
        }
    }

    // 如果有动态生成的输入框,调用此方法设置
    public void FixDynamicInputField(TMP_InputField inputField)
    {
        if (inputField.lineType == TMP_InputField.LineType.MultiLineNewline)
        {
            inputField.inputType |= TMP_InputField.InputType.SubmitDone;
            inputField.ForceLabelUpdate();
        }
    }
}

使用说明:将此脚本挂载到场景中的持久化对象(如GameManager)上,启动时自动处理所有已存在的多行输入框;动态生成输入框时,调用FixDynamicInputField方法即可。

方案2:直接操作Android EditText的IME选项

如果方案1无效,可通过Android原生API直接修改输入框的IME配置,强制显示完成按钮:

using UnityEngine;
using TMPro;

public class AndroidMultilineKeyboardFix : MonoBehaviour
{
    void Start()
    {
        foreach (var inputField in FindObjectsOfType<TMP_InputField>())
        {
            if (inputField.lineType == TMP_InputField.LineType.MultiLineNewline)
            {
                // 输入框被选中时触发IME配置修改
                inputField.onSelect.AddListener(_ => UpdateImeOptions(inputField));
            }
        }
    }

    void UpdateImeOptions(TMP_InputField inputField)
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        // 获取底层Android EditText对象
        var editText = inputField.textComponent.GetComponent<AndroidJavaObject>("android.widget.EditText");
        if (editText == null) return;

        // 引用Android原生常量
        var editorInfoClass = AndroidJNI.FindClass("android/view/inputmethod/EditorInfo");
        int imeActionDone = AndroidJNI.GetStaticIntField(editorInfoClass, "IME_ACTION_DONE");
        int imeFlagNoExtractUi = AndroidJNI.GetStaticIntField(editorInfoClass, "IME_FLAG_NO_EXTRACT_UI");
        
        // 设置IME选项:显示完成按钮+禁用全屏输入模式
        editText.Call("setImeOptions", imeActionDone | imeFlagNoExtractUi);

        // 确保输入类型为多行文本
        var inputTypeClass = AndroidJNI.FindClass("android/text/InputType");
        int typeClassText = AndroidJNI.GetStaticIntField(inputTypeClass, "TYPE_CLASS_TEXT");
        int typeFlagMultiLine = AndroidJNI.GetStaticIntField(inputTypeClass, "TYPE_TEXT_FLAG_MULTI_LINE");
        editText.Call("setInputType", typeClassText | typeFlagMultiLine);
#endif
    }
}

使用说明:同样挂载到场景持久化对象,此方法绕过Unity的TMP封装,直接修改Android原生控件,适配性更强。

关键说明

  • 问题根源:Unity 2022版本对Android 13的输入法适配逻辑调整,多行输入框默认未配置IME_ACTION_DONE标志,导致软键盘仅显示换行键;Android 10及更早版本的输入法对多行输入的处理逻辑不同,因此无此问题。
  • 测试验证:需在Android 13设备上测试,Android 10设备无需修改即可正常显示。

内容的提问来源于stack exchange,提问作者Jim Hopper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:11:02