在Unity 3D中单击“制表符”按钮时如何聚焦输入字段

时间:2018-06-25 04:35:44

标签: unity3d

enter image description here我想要使用选项卡按钮的焦点输入字段。我已经找到了一些用于集中输入字段的代码,但是那不满足我的要求。在我的应用程序中,一页设计类似于水平和垂直格式的输入字段数。在我的页面中,有3行输入字段,每行有3个输入字段。我的要求是,当用户单击选项卡按钮聚焦下一个输入字段时,它起作用,但是当到达行尾时,如何聚焦下一行包含输入字段。请提出任何想法。谢谢。您可以在下面找到我的示例页面设计。

这是我尝试过的代码。

Selectable next = system.currentSelectedGameObject.GetComponent<Selectable().FindSelectableOnRight();                               
if (next != null)
{
    InputField inputfield = next.GetComponent<InputField>();

    if (inputfield != null)
    {                       
        inputfield.OnPointerClick(new PointerEventData(system)); 
        system.SetSelectedGameObject(next.gameObject, new BaseEventData(system));
    }
}

4 个答案:

答案 0 :(得分:2)

我已经通过NGUI实现了类似的功能,如果使用UGUI,则可以进行一些修改。这个想法是通过公共变量手动设置nextInput

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIInputTab : MonoBehaviour {

    UIInput thisInput;
    public GameObject nextInput;
    void Start () {
        thisInput = transform.GetComponent<UIInput>();
    }

    void Update () {
        if (thisInput.isSelected)
        {
            if (nextInput != null && Input.GetKeyDown(KeyCode.Tab))
            {
                UICamera.selectedObject = nextInput;
            }
        }
    }
}

更新 :动态生成随机数InputField并分配下一个InputField。

InputfieldTest.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class InputfieldTest : MonoBehaviour {

    public GameObject inputFieldPrefab;
    public GameObject pannel;
    private GameObject lastInput;

    EventSystem m_EventSystem;

    void Start () {

        m_EventSystem = EventSystem.current;

        for(int i = 0; i < Random.Range(5,10);i++){
            GameObject collum = new GameObject();
            collum.transform.parent = pannel.transform;
            collum.name = "Column" + i;

            for (int j = 0; j < Random.Range(2, 8);j++){
                GameObject input = Instantiate(inputFieldPrefab);
                input.transform.parent = collum.transform;
                input.GetComponent<RectTransform>().position = new Vector3(300+ 200 * j, 300+ 200 * i, 0);
                input.name = "InputField" + i + "-" + j;


                // set nextInput
                if(lastInput != null) {
                    lastInput.GetComponent<InputTabControl>().nextInput = input;
                }
                lastInput = input;
            }

        }
    }

    void Update () {
        GameObject currentSelect = m_EventSystem.currentSelectedGameObject;
        if (currentSelect != null)
        {
            print(currentSelect.name);
            GameObject nextInput = currentSelect.GetComponent<InputTabControl>().nextInput;
            if (nextInput != null && Input.GetKeyDown(KeyCode.Tab))
            {
                InputField inputfield = nextInput.GetComponent<InputField>();

                if (inputfield != null)
                {
                    inputfield.OnPointerClick(new PointerEventData(m_EventSystem));
                    m_EventSystem.SetSelectedGameObject(nextInput.gameObject, new BaseEventData(m_EventSystem));
                }


            }
        }
    }
}

InputTabControl.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InputTabControl : MonoBehaviour {

    public GameObject nextInput;

}

结果: enter image description here enter image description here

答案 1 :(得分:0)

这是我的解决方法,非常相似。

public class TabToNextController : MonoBehaviour {

    public InputField nextField;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (GetComponent<InputField> ().isFocused && Input.GetKeyDown (KeyCode.Tab)) {
            nextField.ActivateInputField ();
        }
}

只需将此脚本添加到要用作选项卡的项目中即可。然后,在GUI的输入字段中,您想将其制表为“ nextField”。

答案 2 :(得分:0)

我最近遇到了这个问题,这让我发疯,因为认为没有选项卡功能。我以前从没注意到。到目前为止似乎可行的简单解决方案是使用UI元素继承的Selectable类。

我用最常见的类型(对我来说)进行了测试-InputField,Buttons和下拉列表。

  • 按预期选择每个
  • 使用空格键单击按钮
  • 使用空格键打开下拉列表

如果要使用完整的Web样式控件(例如箭头键)来调用下拉菜单,则需要编写该代码。

public class TabToNextController : MonoBehaviour, IUpdateSelectedHandler
{
    public Selectable nextField;

    public void OnUpdateSelected(BaseEventData data)
    {
        if (Input.GetKeyDown(KeyCode.Tab))
            nextField.Select();
    }
}

欢呼

答案 3 :(得分:0)

这对我有用:

    public Selectable next; //if you want the cursor to start at a specific field
                            //you can set this in the inspector to any input field
    private EventSystem system;
    private int tabIndex; //to keep track of cursor
    void Start()
    {
        system = EventSystem.current;// EventSystemManager.currentSystem;
        //if you don't want to set next in the inspector, you can do it here
        //next = Selectable.allSelectables[0];
        tabIndex = 0;
        next.Select(); //make sure to do this!
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            if (tabIndex >= Selectable.allSelectables.Count) 
            {
                next = Selectable.allSelectables[0];
                tabIndex = 0;
            } 
            else 
            {
        //if nothing is selected then system.currentSelectedGameObject 
        //will throw a nullPointer Exception
                next = system.currentSelectedGameObject.GetComponent<Selectable>()
                       .FindSelectableOnDown(); 
                tabIndex++;
            }
            Debug.Log(next);
            if (next != null)
            {
             
                InputField inputfield = next.GetComponent<InputField>();
                if (inputfield != null)
                    inputfield.OnPointerClick(new PointerEventData(system));  //if it's an input field, also set the text caret
             
                system.SetSelectedGameObject(next.gameObject, new BaseEventData(system));
            }
        }
    }